Activity log for bug #1566416

Date Who What changed Old value New value Message
2016-04-05 16:24:12 Tim Burke bug added bug
2016-04-05 20:59:17 Tristan Cacqueray bug task added ossa
2016-04-05 20:59:29 Tristan Cacqueray ossa: status New Incomplete
2016-04-05 20:59:54 Tristan Cacqueray description Ordinarily, during a keystone-authenticated swift3 request, * the client talks to a swift proxy-server, sending a request with an Authorization header that includes a credential identifier and signature; * swift3 (in the proxy-server's pipeline) recognizes that this is a S3 request, normalizes the request information to be the same format as was used in the signature, and includes it in the WSGI environment; * s3_token picks up the normalized request, credential identifier, and user-provided signature and sends them all to keystone; * keystone's s3 extension uses the credential identifier to look up the credential's secret, signs the normalized request, and compares the user-provided signature to the expected one. If they match, a fresh project-scoped token is issued; otherwise a 401 is returned. * s3_token either bubbles up the 401 response or puts the token and tenant information into the WSGI environment so swift3 and auth_token may continue handling the request. Given knowledge of the HTTP method, path, and headers of a valid past request, an attacker can bypass swift and obtain a project-scoped token directly from keystone. This may be done well after the initial request (and resulting token) have expired. The new token may be used to access any service for which the original user is authorized. Proposed solution: Have the s3 extension in keystone verify that the request came from the s3_token middleware. This may be done via either a service token (similar to what's done in keystonemiddleware's auth_token middleware) or a rotating pre-shared key (similar to what's done in swift's tempurl middleware). Alternative solutions: Have the s3 extension only enabled in the v2.0 admin pipeline, remove it from the v3 pipeline, and expose the v2.0 admin endpoint only on internal networks. With the convergence of the admin and public pipelines in v3, this seems unlikely to provide a long-term solution. However, it may be a useful mitigation for deployments that cannot quickly upgrade. Have the s3 extension parse the normalized request, find the timestamp, and reject requests with a timestamp more than 5 minutes off from the server's time. This conflates keystone's responsibility (authentication) with that of swift3 (authorization) and leads to duplicated efforts. Additional mitigation: Require users to change their S3/EC2 credentials regularly. (Note that while this is similar to bug #1561199, the two bugs cover separate issues. 1561199 involves inter-middleware communication within a single WSGI pipeline. This bug involves the communication between separate services.) This issue is being treated as a potential security risk under embargo. Please do not make any public mention of embargoed (private) security vulnerabilities before their coordinated publication by the OpenStack Vulnerability Management Team in the form of an official OpenStack Security Advisory. This includes discussion of the bug or associated fixes in public forums such as mailing lists, code review systems and bug trackers. Please also avoid private disclosure to other individuals not already approved for access to this information, and provide this same reminder to those who are made aware of the issue prior to publication. All discussion should remain confined to this private bug report, and any proposed fixes should be added to the bug as attachments. -- Ordinarily, during a keystone-authenticated swift3 request,  * the client talks to a swift proxy-server, sending a request with    an Authorization header that includes a credential identifier and    signature;  * swift3 (in the proxy-server's pipeline) recognizes that this is    a S3 request, normalizes the request information to be the same    format as was used in the signature, and includes it in the WSGI    environment;  * s3_token picks up the normalized request, credential identifier,    and user-provided signature and sends them all to keystone;  * keystone's s3 extension uses the credential identifier to look up    the credential's secret, signs the normalized request, and    compares the user-provided signature to the expected one. If they    match, a fresh project-scoped token is issued; otherwise a 401 is    returned.  * s3_token either bubbles up the 401 response or puts the token and    tenant information into the WSGI environment so swift3 and    auth_token may continue handling the request. Given knowledge of the HTTP method, path, and headers of a valid past request, an attacker can bypass swift and obtain a project-scoped token directly from keystone. This may be done well after the initial request (and resulting token) have expired. The new token may be used to access any service for which the original user is authorized. Proposed solution: Have the s3 extension in keystone verify that the request came from the s3_token middleware. This may be done via either a service token (similar to what's done in keystonemiddleware's auth_token middleware) or a rotating pre-shared key (similar to what's done in swift's tempurl middleware). Alternative solutions: Have the s3 extension only enabled in the v2.0 admin pipeline, remove it from the v3 pipeline, and expose the v2.0 admin endpoint only on internal networks. With the convergence of the admin and public pipelines in v3, this seems unlikely to provide a long-term solution. However, it may be a useful mitigation for deployments that cannot quickly upgrade. Have the s3 extension parse the normalized request, find the timestamp, and reject requests with a timestamp more than 5 minutes off from the server's time. This conflates keystone's responsibility (authentication) with that of swift3 (authorization) and leads to duplicated efforts. Additional mitigation: Require users to change their S3/EC2 credentials regularly. (Note that while this is similar to bug #1561199, the two bugs cover separate issues. 1561199 involves inter-middleware communication within a single WSGI pipeline. This bug involves the communication between separate services.)
2016-04-05 21:01:27 Tristan Cacqueray bug added subscriber Keystone Core security contacts
2016-04-12 15:18:32 Dolph Mathews bug added subscriber David Stanek
2016-05-30 18:10:55 Tristan Cacqueray bug added subscriber Swift Core security contacts
2016-08-29 09:12:24 Donagh McCabe bug added subscriber Gerry Drudy
2017-01-18 01:23:50 Kota Tsuyuzaki bug added subscriber Kota Tsuyuzaki
2017-03-04 01:36:41 Jeremy Stanley information type Private Security Public Security
2017-03-20 13:56:24 Tristan Cacqueray description This issue is being treated as a potential security risk under embargo. Please do not make any public mention of embargoed (private) security vulnerabilities before their coordinated publication by the OpenStack Vulnerability Management Team in the form of an official OpenStack Security Advisory. This includes discussion of the bug or associated fixes in public forums such as mailing lists, code review systems and bug trackers. Please also avoid private disclosure to other individuals not already approved for access to this information, and provide this same reminder to those who are made aware of the issue prior to publication. All discussion should remain confined to this private bug report, and any proposed fixes should be added to the bug as attachments. -- Ordinarily, during a keystone-authenticated swift3 request,  * the client talks to a swift proxy-server, sending a request with    an Authorization header that includes a credential identifier and    signature;  * swift3 (in the proxy-server's pipeline) recognizes that this is    a S3 request, normalizes the request information to be the same    format as was used in the signature, and includes it in the WSGI    environment;  * s3_token picks up the normalized request, credential identifier,    and user-provided signature and sends them all to keystone;  * keystone's s3 extension uses the credential identifier to look up    the credential's secret, signs the normalized request, and    compares the user-provided signature to the expected one. If they    match, a fresh project-scoped token is issued; otherwise a 401 is    returned.  * s3_token either bubbles up the 401 response or puts the token and    tenant information into the WSGI environment so swift3 and    auth_token may continue handling the request. Given knowledge of the HTTP method, path, and headers of a valid past request, an attacker can bypass swift and obtain a project-scoped token directly from keystone. This may be done well after the initial request (and resulting token) have expired. The new token may be used to access any service for which the original user is authorized. Proposed solution: Have the s3 extension in keystone verify that the request came from the s3_token middleware. This may be done via either a service token (similar to what's done in keystonemiddleware's auth_token middleware) or a rotating pre-shared key (similar to what's done in swift's tempurl middleware). Alternative solutions: Have the s3 extension only enabled in the v2.0 admin pipeline, remove it from the v3 pipeline, and expose the v2.0 admin endpoint only on internal networks. With the convergence of the admin and public pipelines in v3, this seems unlikely to provide a long-term solution. However, it may be a useful mitigation for deployments that cannot quickly upgrade. Have the s3 extension parse the normalized request, find the timestamp, and reject requests with a timestamp more than 5 minutes off from the server's time. This conflates keystone's responsibility (authentication) with that of swift3 (authorization) and leads to duplicated efforts. Additional mitigation: Require users to change their S3/EC2 credentials regularly. (Note that while this is similar to bug #1561199, the two bugs cover separate issues. 1561199 involves inter-middleware communication within a single WSGI pipeline. This bug involves the communication between separate services.) Ordinarily, during a keystone-authenticated swift3 request,  * the client talks to a swift proxy-server, sending a request with    an Authorization header that includes a credential identifier and    signature;  * swift3 (in the proxy-server's pipeline) recognizes that this is    a S3 request, normalizes the request information to be the same    format as was used in the signature, and includes it in the WSGI    environment;  * s3_token picks up the normalized request, credential identifier,    and user-provided signature and sends them all to keystone;  * keystone's s3 extension uses the credential identifier to look up    the credential's secret, signs the normalized request, and    compares the user-provided signature to the expected one. If they    match, a fresh project-scoped token is issued; otherwise a 401 is    returned.  * s3_token either bubbles up the 401 response or puts the token and    tenant information into the WSGI environment so swift3 and    auth_token may continue handling the request. Given knowledge of the HTTP method, path, and headers of a valid past request, an attacker can bypass swift and obtain a project-scoped token directly from keystone. This may be done well after the initial request (and resulting token) have expired. The new token may be used to access any service for which the original user is authorized. Proposed solution: Have the s3 extension in keystone verify that the request came from the s3_token middleware. This may be done via either a service token (similar to what's done in keystonemiddleware's auth_token middleware) or a rotating pre-shared key (similar to what's done in swift's tempurl middleware). Alternative solutions: Have the s3 extension only enabled in the v2.0 admin pipeline, remove it from the v3 pipeline, and expose the v2.0 admin endpoint only on internal networks. With the convergence of the admin and public pipelines in v3, this seems unlikely to provide a long-term solution. However, it may be a useful mitigation for deployments that cannot quickly upgrade. Have the s3 extension parse the normalized request, find the timestamp, and reject requests with a timestamp more than 5 minutes off from the server's time. This conflates keystone's responsibility (authentication) with that of swift3 (authorization) and leads to duplicated efforts. Additional mitigation: Require users to change their S3/EC2 credentials regularly. (Note that while this is similar to bug #1561199, the two bugs cover separate issues. 1561199 involves inter-middleware communication within a single WSGI pipeline. This bug involves the communication between separate services.)
2018-01-25 08:54:13 Colleen Murphy keystone: status New Fix Released
2019-01-28 20:55:30 Lance Bragstad keystone: milestone queens-3
2021-02-17 19:52:01 Jeremy Stanley ossa: status Incomplete Won't Fix