[Openstack-security] [Bug 1795800] Re: Timing oracle in core auth plugin simplifies brute-forcing usernames
Gage Hugo
gagehugo at gmail.com
Mon Mar 25 19:24:57 UTC 2019
Still working on this, I've gotten a flask hook setup to catch any
unauthorized, allowing us to delay the Unauthorized exception until the
very end, however I'm still not seeing identical times. Local testing is
showing .480 seconds for an existing user while it's gone from ~0.022 to
~0.033 for invalid users with delaying the exception.
I'm wondering if this is due to the delay with generating a token for
successful authentication, instead of simply continuing on when failing
to authenticate.
--
You received this bug notification because you are a member of OpenStack
Security SIG, which is subscribed to OpenStack.
https://bugs.launchpad.net/bugs/1795800
Title:
Timing oracle in core auth plugin simplifies brute-forcing usernames
Status in OpenStack Identity (keystone):
In Progress
Status in OpenStack Security Advisory:
Won't Fix
Bug description:
The response times for POST /v3/auth/tokens are significantly higher
for valid usernames compared to those of invalid ones, making it
possible to enumerate users on the system.
Examples:
# For invalid username
+ Request
POST /v3/auth/tokens HTTP/1.1
Host: hostname:5000
Connection: close
Content-Length: 141
Content-Type: application/json
{
"auth":{
"identity":{
"methods":[
"password"
],
"password":{
"user":{
"name":"nonexisting",
"domain":{
"name":"Default"
},
"password":"devstacker"
}
}
}
}
}
+ Response Time: <150ms
# For valid username ('admin' in this case)
+ Request
POST /v3/auth/tokens HTTP/1.1
Host: hostname:5000
Connection: close
Content-Length: 139
Content-Type: application/json
{
"auth":{
"identity":{
"methods":[
"password"
],
"password":{
"user":{
"name":"admin",
"domain":{
"name":"Default"
},
"password":"devstacker"
}
}
}
}
}
+ Response time: >600ms
# Tested version
v3.8
[UPDATE 3 Oct 2018 5:01 AEST]
Looks like it's also possible to enumerate for valid "domain" too. There're 2 ways that I can see:
* With valid username: use the above user enum bug to guess the valid username, then brute the "domain" parameter. Response times are significantly higher for valid compared to invalid domains.
* Without valid username: get a baseline response time using invalid username AND invalid domain name. Bruteforce the "domain" param until the response time hits an average high. For me invalid domain falls in the 90-100ms range whereas valid ones show 100+ms. This one looks a bit more obscure i.e. timing difference is not as distinguishable, but should still be recognizable with a good sample size.
To manage notifications about this bug go to:
https://bugs.launchpad.net/keystone/+bug/1795800/+subscriptions
More information about the Openstack-security
mailing list