Invented by OpenBSD
tedunangst.com
tedunangst.com
- LLVM/Clang (it's a matter of taste, but it's also the feature :-) )
- FreeBSD Jails and Mac (These are extremely strong security features if implemented correctly. Especially jails are really undervalued/misunderstood IMHO.)
- State-of-art network stack (faster than any other BSD or Linux. Supports technologies like NetMap)
- ZFS support (important for both desktops/servers)
- PF version runs on multiple cpus (OpenBSD's version is more advanced though)
- DTrace (although not mature enough IMHO)
- Better hardware support (e.g. wifi cards)
- BHyve (virtualisation)
- Capsicum (security)
Other little things like:
- Unmapped VMIO buffers - Variable symlinks (used under jails)
Now generally speaking, choosing an operating system due to bigotry and what-not is stupid. Most of the times, engineers go with what they need: If you need a secure bastion, OpenBSD gives you more although FreeBSD can be turned virtually impenetrable as can Linux. OpenBSD comes with more bells and whistles on this particular area though.
So all in all, it boils to what you need. The major reason why people choose FreeBSD over OpenBSD is because the 'security level' of the OS is more than acceptable while retaining a much better hardware support.
I'm all for open source all the way, especially on a secure system, but OpenBSD+nVidia is basically unusable on the desktop. And that's a huge class of systems. You can't buy Intel PCIe cards; and AMD drivers are always a buggy mess.
> PF version runs on multiple cpus (OpenBSD's version is more advanced though)
I really hate the trade-off of FreeBSD SMP support, or OpenBSD queuing support. (yes, you can compile a FreeBSD kernel with ALTQ, but it's said to be buggy with SMP.)
What is "more advanced" about it?
> (yes, you can compile a FreeBSD kernel with ALTQ, but it's said to be buggy with SMP.)
not that we've seen in 300,000 installs.
Any thoughts on why they leave it off out of the box, then? I know it's not crazy hard to build a kernel (used to have to do it to get sound support in the 4.x series), but I'd rather not build kernels if I don't have to =)
> - FreeBSD Jails and Mac (These are extremely strong security features if implemented correctly. Especially jails are really undervalued/misunderstood IMHO.)
Aren't these are only necessary if you let people you don't trust into your system?
> - PF version runs on multiple cpus (OpenBSD's version is more advanced though)
Personally I dislike running PF on FreeBSD as it requires me to resort to old docs and use old syntaxes.
> - Capsicum (security)
Isn't this being ported as we speak?
They also provide an additional layer of protection if you're running server software which gets exploited.
For me, not being able to run a current kernel-accelerated qemu is a real problem. Is there anything preventing this work from being done, or is it just a matter of bhyve having the momentum so nobody's bothering?
Can you be more specific about that comment?
Because getting commercial support for it is hard
Because getting drivers for it is hard
Because ..
Lots of reasons, nothing to do with feel-good or whatever else. OpenBSD's focus on security is commendable, but it's not the only reason you'd pick an operating system.
I have found OpenBSD to be pretty easy to install and I really prefer the hier over FreeBSD's.
1) This does not include the obvious "must run on" for certain software packages. We have Windows Server, OS X, Red Hat, and an AS/400 (iSeries) because of vendor / government requirements.
In particular FreeBSD security is so abysmal, once you plug it to the internet you can't really say is your computer anymore.
Edit: Downvote this: Windows Vista had ASLR and latest FreeBSD 10 does not.
OpenBSD has the most secure marketing message of all the BSDs. It begins and ends there. Stop banging drums, fanboys.
edit: why can't we all just get along?
Nowadays, other than the odd ARM problem, or esoteric reversing challenge, everything is Linux. It doesn't matter anyway, though, since CTFs are designed with the express purpose of being insecure.
I'm as big a fan of OpenBSD as anyone, but there's no reason someone couldn't intentionally cripple OpenBSD to use as a platform for CTFs.
1. The documentation is unmatched.
2. The community is very nice.
I don't know if 1 applies to OpenBSD or not, but 2 doesn't.
5 years of base system support for a release branch with rolling-release ports/packages vs OpenBSD's "1 year and you're unsupported" model.
Furthermore, netbsd and freebsd offer substantial improvements: netbsd will run on anything, freebsd will offer you some pretty ridiculous tools and a huge base of ports and support.
When I - not quite a year ago - looked into possible setups for this thing I found pkg-ng (and poudriere) both a lot more comfortable and familiar. More powerful. Sold.
I run OpenBSD on one of my laptops, but if performance or compatibility are important factors, you might look at other tools for the job -- the different BSDs have different strengths.
NetBSD focuses on engineering and architecture.
Having used both, I'd say the security focus of OpenBSD means it's often lacking consistency and "polish". NetBSD's focus on engineering means it's consistent, clean, etc.
What other operating system has a build.sh?
https://www.netbsd.org/docs/guide/en/chap-build.html
You can build identical binaries for NetBSD on any *NIX host OS. That's impressive.
My recollection was that OpenBSD code was actually quite polished, and even elegant in lots of places. They also produced what I think were easily the best and most complete manpages out there. It was actually enjoyable to read both the code and manpages, and pretty easy to understand (assuming proficiency in C and basic machine architecture, of course).
What was not enjoyable, for me, was the constant hostility on the mailing list and frequent lashing out at others in various OSS communities (...as demonstrated in the OP). I know there there were others for whom that played no small part in their loss of interest in the project.
I wonder why you think so. I've only ever used OpenBSD and NetBSD on PCs and Unix workstations. I have never, ever, in any domain found NetBSD to have more "polish" than OpenBSD.
From the initial installation where OpenBSD helps you with everything and NetBSD, well, doesn't, to reading and using documentation (OpenBSD's man pages are the best around, with the possible oddball exception of some old Open Group pages which include code examples), OpenBSD seems to be miles ahead.
So I just wonder what you're talking about specifically.
It is simply bad design to keep adding un-toggleable "security" mechanisms, like being unable to directly script password logins and the like.
This is a standard task which comes up all the damn time in any level of sysadmin work. I'm never going to connect to these machines again, and can't get anyone to cooperate about them. Which means, I'm going to need to feed that list to ssh or rsync with password authentication.
Your current options to do this are jump through ridiculous hoops with expect, or switch to something else entirely (like paramiko, which is awesome but doesn't solve the rsync case cleanly).
Yet all this could be solved by just having a damn --read-password-from prompt which would do it automatically. It would also be nice to have --skip-permissions-checks (and actual error messages which specified which permissions, on what file, are missing rather then current silent failure).
Which I think I'm going to code up for the next time I end up doing something like this (probably alongside "use JSON for remote rsync file specifications").
Having seen NetBSD's source code more than once, "clean" is not exactly the thought that always comes to mind. Au contraire, OpenBSD has a simplicity-driven approach that's one of the cornerstones of most of the awesome stuff that they achieved.
That being said, NetBSD's build system is very good. OpenBSD's doesn't help too much in the portability department.
I was a huge NetBSD fan for many years, but I moved to OpenBSD about 6-7 years ago because I felt it actually had more consistency and polish. It's been so long now though that I don't remember specifics.
Form what little I've seen of the OpenBSD folks, having sound engineering and architecture is exactly how they attack security.
> NihBSD
Or SourgrapesBSD ? It's not clear that this was written "just to be different".
1) W^X protections
2) ASLR
3) Stack canaries
4) strlcpy
5) OpenSSH!
6) Heap guard pages
7) Software NX
8) Etc.
Maybe project PAX invented some of those, but massive deployment was in OpenBSD first. Well if you can call them massive..
Edit: Yes, I missed it.
While the OpenBSD guys can be obnoxious twats at times, they were definitely in the right when they forked the OpenSSH code.
https://github.com/libressl-portable/openbsd/search?utf8=%E2...
NetBSD's implementation, specifically with regard to how it handles deallocation, diverges from OpenBSDs - though its documentation is wrong.
LibreSSL (for example) will compile just fine on NetBSD, but as the logic of the two implementations differ so too will correct memory management in LibreSSL. This is just one example of how a port of secure code can be made insecure.
So it doesn't have to do with reallocarray specifically. It has to do with drawing out the security implications of the article under discussion.
1. It is defined for intmax_t instead of long long.
2. It supports various bases. (At least I regularly need hex or base36)
3. It can deal with trailing characters.
4. There are matching strtou and strtoumax operations
It's of course bad if NetBSD introduces an strtonum, which behaves differently from the OpenBSD one. But maybe the OpenBSD folks should look into strtoi and strtoimax instead of blindly following their "invented here" principle...
Is that reasonable? No clue, I don't write/know/do C..
1: http://www.tedunangst.com/flak/post/the-design-of-strtonum
NetBSD has also been the first to introduce new features like reforming the rc boot scripts into the more modern rc.d system.
Lots of people (esp. Linux users) have this impression that all Unix-likes besides Linux are hulking dinosaurs stuck in the old ages, but this couldn't be further from the truth.
but it was systemd that pushed me towards it, I'm not bound by random binaries that do random things with little documentation- everything is very clearly understandable and I can even guess what things will be doing with a large degree of accuracy.
the whole thing seems much more "sane", but- Linux is a better desktop in my opinion.
And I got completely tired of "distributionitis" on Linux--"Oh, you can't upgrade that particular package without upgrading every other package on the system."
pkg upgrade apache22
is unsupported, but it might work.If you understand the potential consequences you can do what you wish with the ports tree as an advanced user.
Modern Linux distros are messy and complex. I'm sure it's for good reason, they provider a ton of feature and tools for running very large installations. I just don't need that, we don't have more servers than you could reasonably manage manually.
I miss the consistency and simplicity of OpenBSD every time I log into one of our servers.
this means that, as a developer, when calling these functions you can't be sure of if you're calling it in a safe way.. openBSD makes code deliberately designed to be portable, and other BSD's make it non-portable by altering it in odd ways, yielding dangerous consequences by reusing the namespace.
NetBSD very recently imported these functions (reallocarray and strtonum) to libc after much objection (over several years actually) to their poor APIs, yet finding that they crop up time and again in code used in base (and then multiple copies exist, in out of the way places). So, as a pragmatic solution they are now available from libc if _OPENBSD_SOURCE is defined. Cleaner API functions were proposed, with wrappers which would provide equivalent functionality for the OpenBSD functions. Some difference was noted, and recently fixed in these wrappers.
The root cause for the NetBSD changes then, seems to be that these functions keep cropping up, and the job of libc is to provide commonly used functions.
I believe the intention is, that the cleaner API is proposed to replace the original OpenBSD ones, which are not properly portable (strtonum for instance, returns hard coded english error strings in ASCII)
The root cause for the blog entry by Ted Unangst is probably that he is an OpenBSD developer and was involved in creating these functions, which are now being criticised.
These root causes don't seem the same to me.
It's not bad, just human behavior in small groups. The politics behind it aren't interesting to me, I'm just noting that it's not likely as completely quarantined from each other as they might complain, even if they don't realize such. That's totally cool with me, even if my supposition (again, unfounded even if it is how such things often occur) is completely incorrect in this particular instance. =c)
I .. am not sure why that would be considered not portable? Admitted, I'm neither into C nor do I have experience in the field, but .. that seems to be easy to read, contains clear/concise error messages _on top_ of clear error codes.
1) Any consumer can ignore the string and map the error code to a message in Klingon or whatever else, no?
2) The function name is in ASCII/English. So are the parameter names. Most of your C code is probably reading ~somewhat~ like english, and usually is restricted to ASCII? Is it really a problem that this method returns both a well-defined number and a simple string in case of an error?
Back to the first line: I .. am certainly clueless here and just watching from the sidelines. But I'm kinda serious about the questions and genuinely curious why you object to that part of the implementation?
1: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib...
for 2, the function can be called (as can any C function) from a source character set other than ASCII, as the compiler should handle that. The name is technically english its true and programmer needs to know some english, perhaps.. but the user does not need to know that
if the error code is used, then the error string is superfluous, and C library functions are not in the habit of providing superfluous information. C is pretty low level after all.
Here is more reading about the objections the NetBSD folk had with strtonum(3)
http://mailing.netbsd.tech.userlevel.narkive.com/mZ37nlai/strtonum-3-from-openbsdWhat is a user in your reply? I mean, an end user / my mom isn't going to call strtonum? Some developer does. And said developer can absolutely ignore the string's content?
Test for success: errno is 0, errstrp is NULL Handle error: Use errno or errstrp - the latter gives you a bit more information (reports a different error for invalid ranges, too small vs. too large).
But if you don't care, errno is fine, no? And we're still talking about the programmer here, as far as I'm concerned.
Ted has a description of his intentions here [1]. I guess I'm confused why there's a fuzz about it, because technically this method should be good enough? I do have to shake my head at the "Even if intmax_t probably would have been a better choice, I think we’re sticking with long long just because it frustrates people unwilling to admit it doesn’t make a difference." remark, but .. other than that? Does it .. matter?
1: http://www.tedunangst.com/flak/post/the-design-of-strtonum
testing for errno == 0 is not actually useful, since errno is not set except on error (that is by design of errno, it is always an indication of what the last error was, not that there was an error)
and errstrp doesn't give the Klingon user you mentioned any information at all, since they can't read English.
fafner said it better than I in https://news.ycombinator.com/item?id=9184734
and yes it does matter, for a standard libc function, because if you don't take care about setting standards, then your standards will be a mess.