[Freeipa-devel] [PATCH] 360 be smarter about decoding certs

Rob Crittenden rcritten at redhat.com
Fri Jan 29 16:26:43 UTC 2010


John Dennis wrote:
> On 01/29/2010 09:28 AM, Rob Crittenden wrote:
>> John Dennis wrote:
>>> On 01/28/2010 10:30 PM, Rob Crittenden wrote:
>>>> John Dennis wrote:
>>>>> On 01/28/2010 04:15 PM, Rob Crittenden wrote:
>>>>>> Gah, got the description mixed up with the last patch :-(
>>>>>>
>>>>>> Be a bit smarter about decoding certificates that might be base64
>>>>>> encoded. First see if it only contains those characters allowed 
>>>>>> before
>>>>>> trying to decode it. This reduces the number of false positives.
>>>>>
>>>>> I'm not sure the test is doing what you want or even if it's the right
>>>>> test.
>>>>>
>>>>> The test is saying "If there is one or more characters in the bas64
>>>>> alphabet then try and decode. That means just about anything will
>>>>> match, which doesn't seem like a very strong test.
>>>>>
>>>>> Why not just try and decode it and let the decoder decide if it's
>>>>> really base64, the decoder has much strong rules about the input,
>>>>> including assuring the padding is correct.
>>>>>
>>>>
>>>> The reason is I had a binary cert that was correctly decoded by the
>>>> base64 encoder. I don't know the why's and wherefores but there it is.
>>>
>>> Then testing to see if each byte is in the base64 alphabet would not
>>> have prevented this error.
>>
>> And yet it did in practice. I think you're assuming too much about the
>> input testing in base64.b64decode(). It gladly takes binary data, as
>> long as it fits the expected padding.
> 
> You're right, I just went and checked the code, it skips any char not in 
> the base64 alphabet :-(
> 
>>>
>>> For a while now I've been feeling like we need to associate a format
>>> attribute to the certificate (e.g. DER, PEM, BASE64, etc.).
>>
>> There is simply no good way to carry that extra data when all you have
>> is a blob of data. We'd still need some mechanism to look at it and ask
>> "what are you?" That or we simply reject some types of input.
> 
> My concern is that correctly deducing what an object is just by scanning 
> it's contents is not robust. As you've seen it's easy to draw the wrong 
> conclusion. Rather if the convention is "it must be an object in this 
> format" (e.g. canonical) then there is no reason to even ask the 
> question, it's simpler and more robust for most of our (internal) code, 
> we only have to worry about it at the interface boundaries.
> 
> So who enforces the canonical format? The only place we have to be 
> concerned is when it's user provided, any item we produce will be 
> guaranteed to be in the canonical format (hopefully :-). That just means 
> at our interface boundaries we *must* specify the canonical format.
> 
> If we're taking input from the user on the command line we offer them 
> the option of "input as pem", "input as der", "input as base64", try to 
> validate as best we can trusting the user has told us the correct format 
> and then convert to the canonical format.
> 
> Think about the openssl x509 utilities, with those you must specify the 
> input format.
> 
> If we're taking input through an exposed API we do essentially the same 
> thing. Require the format be passed along with the data, validate as 
> best we can, and convert to the canonical format as it enters our system.
> 
> BTW, by having the user/caller indicate the format they're providing 
> will make the validation more robust, for example if it's stated the 
> data is in DER format then there is no reason to even try to see if it 
> can be base64 decoded which might lead to a false positive. Likewise if 
> it's stated it's in pem format it must have the header and footer.
> 
> Bottom line, I'm leery of trying to guess at random points what the 
> format is, it's too easy for the guessing logic to draw the wrong 
> conclusion, I'd much rather see it be explicit.

Perhaps but validators take a single argument so there is no way to pass 
in type.

rob




More information about the Freeipa-devel mailing list