News for hackers. Stuff that matters.
Re:The most dangerous code in the world by tptacek on Wednesday October 24, 2012 @08:18PM (#4695709)
On Twitter today, Daniel Stenberg, Curl's maintainer, said:

@pmjordan @tqbf for test, and also for the same reason browser-users just click yes yes yes on cert dialogues

He seems like a nice guy and being the sole maintainer of Curl seems like a tough and probably unrewarding job. But that said, it's hard to shake the impression that VERIFYHOST=1 exists because people want to believe they're doing SSL/TLS securely, but have trouble getting it configured properly, and that VERIFYHOST=1 exists primarily to give people the feeling of having configured SSL/TLS well without making them actually do that.

Re:The most dangerous code in the world by jpdoctor on Wednesday October 24, 2012 @09:14PM (#4695885)
> and that VERIFYHOST=1 exists primarily to give people the feeling of having configured SSL/TLS well without making them actually do that.

API doc: "When the value is 1, the certificate must contain a Common Name field, but it doesn't matter what name it says. (This is not ordinarily a useful setting)."

[emphasis mine] It's hard to get clearer than that.

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTS...

Re:The most dangerous code in the world by tptacek on Wednesday October 24, 2012 @09:16PM (#4695889)
I think we are all clear that if library users carefully read the documentation, this is an avoidable flaw. I'm not sure what that has to do with my point. If even the Curl author thinks VERIFYHOST=true isn't useful, why does it work that way? The answer is: it shouldn't.

"Here's an option that you could reasonably expect to be boolean. And lo! the code appears to work if you treat it as a boolean. But, just to mess with you, I introduced an apparently useless option to handle the 'true' case in that boolean, and introduced an 'even truer' value that does what you expected".

This is simply a terrible, dangerous design. It is, like I said on Twitter today, a vulnerability in Curl, and one that should be fixed. The option expressed today by VERIFYHOST=1 should instead be the case when VERIFYHOST=-1 or VERIFYHOST=666. Meanwhile, VERIFYHOST=1 should, tomorrow if possible, do exactly what VERIFYHOST=2 does today.

Re:The most dangerous code in the world by jpdoctor on Thursday October 25, 2012 @12:20AM (#4696357)
> I'm not sure what that has to do with my point.

The point of yours that I addressed was: "that VERIFYHOST=1 exists primarily to give people the feeling of having configured SSL/TLS well without making them actually do that."

Put simply: It does not exist primarily for that purpose.

I can't make it any clearer than that.

Re:The most dangerous code in the world by tptacek on Thursday October 25, 2012 @12:36AM (#4696395)
Oh yeah? Interesting. Tell me, what is the point of checking to see if a certificate has a common name field in it but then not checking to see if that common name is related to the connection bearing the certificate? Make it clear for me, will you?
Re:The most dangerous code in the world by Natsu on Thursday October 25, 2012 @05:26AM (#4696903)
That option exists to punish those evil people who don't read the documentation.

I'm kidding... I think.

Re:The most dangerous code in the world by tptacek on Thursday October 25, 2012 @04:32PM (#4699421)
Of course, who it really punishes is the user.
Re:The most dangerous code in the world by Natsu on Friday October 26, 2012 @01:21AM (#4700960)
Some developers seem to believe that more options are always better, even if removing the bad options makes the software better and easier to use.
Re:The most dangerous code in the world by brazzy on Thursday October 25, 2012 @06:49AM (#4697100)
> Put simply: It does not exist primarily for that purpose.

You fail to provide any proof for that statement. The API doc merely states what the setting does, it says absolutely nothing about about its purpose, and neither do you.

Re:The most dangerous code in the world by zorbo on Thursday October 25, 2012 @02:32AM (#4696627)
You do realize that the curl API says this:

> The default value for this option is 2.

In other words, there is absolutely no issue here. It does the right thing out of the box.

Re:The most dangerous code in the world by kyberias on Thursday October 25, 2012 @12:22AM (#4696361)
This is definitely NOT a vulnerability in curl. I hate it when security people treat everything black and white. There ARE other things to consider.
Re:The most dangerous code in the world by tptacek on Thursday October 25, 2012 @12:36AM (#4696396)
Such as what? When VERIFYHOST=1, curl has basically turned the security part of SSL/TLS off. That seems like kind of a big deal for an HTTPS/SSL API.
Re:The most dangerous code in the world by wisty on Thursday October 25, 2012 @01:50AM (#4696539)
> I hate it when security people treat everything black and white.

That's because experience shows if things are "grey" then someone can almost certainly break in.

Re:The most dangerous code in the world by drivebyacct2 on Wednesday October 24, 2012 @11:12PM (#4696193)
I don't think this shouldn't be changed, but surely it's not one that can be made without thought or concern either. Changing the behavior overnight will undoubtedly break servers and scripts.
Re:The most dangerous code in the world by moe on Wednesday October 24, 2012 @11:52PM (#4696289)
Changing the behavior overnight will undoubtedly break servers and scripts.

It will only break servers and scripts that currently operate under a false sense of security. The maintainer should file a CVE, push the fixed version and let the distros sort out the rest. And he should do it ASAP.

Re:The most dangerous code in the world by mikeash on Thursday October 25, 2012 @11:53AM (#4698068)
It's easy to get much clearer than that. Instead of "1", use a constant with a name like "VERIFY_HOST_SETTING_INSECURE_IGNORE_COMMON_NAME".
Re:The most dangerous code in the world by rolux on Wednesday October 24, 2012 @08:25PM (#4695733)
When it comes to API design, a good rule of thumb is that parameters that can be either 0, 1 or 2 will cause bugs.
Re:The most dangerous code in the world by jrockway on Wednesday October 24, 2012 @08:49PM (#4695818)
More generally: "when it comes to API design, a good rule of thumb is that parameters will cause bugs."
Re:The most dangerous code in the world by rolux on Wednesday October 24, 2012 @09:01PM (#4695854)
No, I was actually trying to be specific. There's usually nothing wrong with 0/1 or 1-9.

Empirically, 0/1/2 either means no/yes/yes-and-something-obscure-on-top-of-that, or, worse, as in this case, no/kind-of-but-not-really/yes.

Re:The most dangerous code in the world by prodigal_erik on Wednesday October 24, 2012 @11:46PM (#4696280)
It's akin to http://c2.com/cgi/wiki?ZeroOneInfinityRule. If you started out thinking it was just a switch, you should be very reluctant to add a third state without rethinking what you really need to express, or you end up with my favorite from TheDailyWTF:

  enum Bool { 
      True,
      False,
      FileNotFound
  };
This would have been much safer as separate AUTHENTICATE_CERT (which checks the CA sig and expiry and revocation) and VERIFY_CERT_COMMON_NAME options, both of which default to true.
Re:The most dangerous code in the world by adgar2 on Wednesday October 24, 2012 @08:59PM (#4695847)
Your more general adage is useless. The one you responded to is useful. A more useful, also general adage would be "the more choice in selecting parameters to an API, the more likely there will be bugs consuming that API."
Re:The most dangerous code in the world by Genmutant on Thursday October 25, 2012 @02:20AM (#4696608)
In this case I think it wouldn't cause bugs if the effect of 1 and 2 would be switched. Then everybody would use it like a boolean and that would be fine, only the few people who really want the name-check disabled would use that option.