RE: const time authentication in bozohttpd

"Terry Moore" <[email protected]>
Newsgroups gmane.os.netbsd.devel.security,gmane.os.netbsd.devel.userlevel
Organization MCCI Corporation
Message-ID <[email protected]>
Perhaps this is a silly comment; but wouldn't it be easier to simply time
stamp the incoming request, and then spin for any authentication failure
until a suitable fixed time has elapsed after the inbound arrival? Or are
you worried about local cache-interference attacks as well? 

--Terry

> -----Original Message-----
> From: [email protected] [mailto:tech-security-
> [email protected]] On Behalf Of shm
> Sent: Wednesday, June 25, 2014 02:35
> To: [email protected]; [email protected]
> Subject: const time authentication in bozohttpd
> 
> Hello,
> 
>  bozohttpd currently checks password using strcmp, which may leak
> information
> about compared data, my patch [1] introduces following countermeasures:
> 
>  - username / password is now compared using introduced timing safe
> function
>    (which run time depends on the known string)
>  - remove username/password from the memory as it's no longer needed
>  - avoid username leak by checking all records in the auth file
(previously
>    when we found valid username but user sent invalid password we break
> from
>    the loop, so other records from the .htpassword weren't checked, thus
an
>    attacker basing on response time could be able to figure out if
username
>    exists) by checking all records in the file.
> 
>  This might sounds a bit paranoid, but I've got real world example that
the
> problem really exists:
> 
>  192.168.1.105 is a bozohttpd (built from HEAD):
> 
>   executed by: : /usr/libexec/httpd -d -c cgi-bin -bf -X -I 8080 .
> 192.168.1.105
> 
>   shm@netbsd-dev ~/www $ cat .htpasswd
>   bla:$sha1$22983$EVXICHNn$wnulZLsEKwnbZTwGRD0vi/8n5rzP
>   test:$sha1$22983$EVXICHNn$wnulZLsEKwnbZTwGRD0vi/8n5rzP
>   test2:$sha1$22983$EVXICHNn$wnulZLsEKwnbZTwGRD0vi/8n5rzP
>   test3:$sha1$22983$EVXICHNn$wnulZLsEKwnbZTwGRD0vi/8n5rzP
>   test4:$sha1$22983$EVXICHNn$wnulZLsEKwnbZTwGRD0vi/8n5rzP
>   test6:$sha1$22983$EVXICHNn$wnulZLsEKwnbZTwGRD0vi/8n5rzO
> 
>   (password is bla)
> 
>   Response times from the machine in the same LAN:
> 
>   For non-existing user:
> 
> $ for ((i=0;i<100;i++)) ; do time curl
> http://notexists:[email protected]:8080/ ; done 2> /dev/stdout | grep
> real |
> sort | uniq -c
>    1 real 0m0.016s
>    1 real 0m0.017s
>    3 real 0m0.018s
>   13 real 0m0.019s
>   50 real 0m0.020s
>    4 real 0m0.021s
>    1 real 0m0.022s
>    1 real 0m0.023s
>    2 real 0m0.024s
>    5 real 0m0.025s
>    7 real 0m0.030s
>    3 real 0m0.031s
>    1 real 0m0.033s
>    1 real 0m0.034s
>    2 real 0m0.035s
>    2 real 0m0.036s
>    1 real 0m0.037s
>    1 real 0m0.040s
>    1 real 0m0.045s
> 
> For existing user:
> 
> $ for ((i=0;i<100;i++)) ; do time curl
http://test3:[email protected]:8080/ ;
> done 2> /dev/stdout | grep real | sort | uniq -c
>    2 real 0m0.086s
>    3 real 0m0.087s
>    3 real 0m0.088s
>   14 real 0m0.089s
>   43 real 0m0.090s
>   11 real 0m0.091s
>    2 real 0m0.092s
>    2 real 0m0.093s
>    2 real 0m0.094s
>    2 real 0m0.095s
>    3 real 0m0.096s
>    1 real 0m0.097s
>    1 real 0m0.098s
>    1 real 0m0.101s
>    1 real 0m0.102s
>    1 real 0m0.104s
>    5 real 0m0.106s
>    1 real 0m0.108s
>    1 real 0m0.115s
>    1 real 0m0.130s
> 
>    For bozohttpd with my patch results are as follows:
> 
>   For not-existing user:
> 
> shm@selene ~ $ for ((i=0;i<100;i++)) ; do time curl
> http://notexists:[email protected]:8080/ ; done 2> /dev/stdout | grep
> real |
> sort | uniq -c
>    2 real 0m0.087s
>    3 real 0m0.088s
>   13 real 0m0.089s
>   51 real 0m0.090s
>   10 real 0m0.091s
>    2 real 0m0.093s
>    2 real 0m0.094s
>    2 real 0m0.095s
>    1 real 0m0.096s
>    1 real 0m0.097s
>    7 real 0m0.100s
>    1 real 0m0.102s
>    1 real 0m0.104s
>    1 real 0m0.106s
>    1 real 0m0.114s
>    1 real 0m0.115s
>    1 real 0m0.268s
> 
> 
>   For existing user:
> 
> shm@selene ~ $ for ((i=0;i<100;i++)) ; do time curl
> http://bla:[email protected]:8080/ ; done 2> /dev/stdout | grep real |
> sort |
> uniq -c
>    1 real 0m0.087s
>   12 real 0m0.089s
>   54 real 0m0.090s
>   11 real 0m0.091s
>    2 real 0m0.092s
>    2 real 0m0.093s
>    1 real 0m0.094s
>    2 real 0m0.096s
>    5 real 0m0.100s
>    2 real 0m0.101s
>    1 real 0m0.104s
>    5 real 0m0.105s
>    1 real 0m0.115s
>    1 real 0m0.120s
> ----
> 
>  Do you have any thoughts on this? I'd like to commit [1], if there is no
> objections.
> 
>  Kind Regards,
>  shm@
> 
> [1] http://netbsd.org/~shm/patches/bozohttpd/consttime_auth-bozo.diff
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.