Details
-
Bug
-
Status: Open (View Workflow)
-
Major
-
Resolution: Unresolved
-
10.0.4, 5.1.67, 5.2.14, 5.3.12, 5.5.33a
-
None
-
None
Description
The check_access() function retrieves privileges like that
db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db,
|
db_is_pattern);
|
Note that it is using sctx->host and sctx->priv_user pair. This is wrong, they belong to different values — the first is the host part in the USER(), the second is the user part in CURRENT_USER().
See the following test case:
create user c@localhost; |
create user c@'%'; |
grant select on mysql.* to c@'%'; |
connect (c,localhost,c,,,,,); |
select user(), current_user(); |
select user from mysql.user group by user; |
disconnect c;
|
connection default; |
drop user c@'%'; |
drop user c@localhost; |
Note that SELECT is allowed, while it is granted to c@%, and we're connected as c@localhost. Which suggests wildcard matching for the purpose of privilege checking. On the other hand, if the test case above is modified as
create user ''@localhost; |
create user c@'%'; |
grant select on mysql.* to c@'%'; |
connect (c,localhost,c,,,,,); |
select user(), current_user(); |
--error ER_TABLEACCESS_DENIED_ERROR
|
select user from mysql.user group by user; |
disconnect c;
|
connection default; |
drop user c@'%'; |
drop user ''@localhost; |
then the SELECT will fail. De facto, wildcard matching works for host names, but not for user names. Which is inconsistent.
Note: if this is to be fixed, all privilege checks should be analyzed and probably changed, including the one for SET ROLE
Attachments
Issue Links
- relates to
-
MDEV-5232 SET ROLE checks privileges differently from check_access()
-
- Closed
-
Activity
Description |
The {{check_access()}} function retrieves privileges like that {code} db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, db_is_pattern); {code} Note that it is using {{sctx->host}} and {{sctx->priv_user}} pair. This is wrong, they belong to different values — the first is the host part in the {{USER()}}, the second is the user part in {{CURRENT_USER()}}. Which means, the following {{SELECT}} is allowed, while it shouldn't be: |
The {{check_access()}} function retrieves privileges like that {code} db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, db_is_pattern); {code} Note that it is using {{sctx->host}} and {{sctx->priv_user}} pair. This is wrong, they belong to different values — the first is the host part in the {{USER()}}, the second is the user part in {{CURRENT_USER()}}. See the following test case: {code:sql} create user c@localhost; create user c; grant select on mysql.* to c; connect (c,localhost,c,,,,,); select user(), current_user(); select user from mysql.user group by user; disconnect c; connection default; drop user c; drop user c@localhost; {code} Note that {{SELECT}} is allowed, while it is granted to {{c@%}}, and we're connected as {{c@localhost}}. Which suggests wildcard matching for the purpose of privilege checking. On the other hand, if the test case above is modified as {code:sql} create user ''@localhost; create user c; grant select on mysql.* to c; connect (c,localhost,c,,,,,); select user(), current_user(); --error ER_TABLEACCESS_DENIED_ERROR select user from mysql.user group by user; disconnect c; connection default; drop user c; drop user ''@localhost; {code} then the {{SELECT}} will fail. De facto, wildcard matching works for host names, but not for user names. Which is inconsistent. _Note: if this is to be fixed, all privilege checks should be analyzed and probably changed, including the one for {{SET ROLE}}_ |
Fix Version/s | 10.0.7 [ 14100 ] | |
Fix Version/s | 10.0.6 [ 13202 ] |
Fix Version/s | 10.0.8 [ 14200 ] | |
Fix Version/s | 10.0.7 [ 14100 ] |
Description |
The {{check_access()}} function retrieves privileges like that {code} db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, db_is_pattern); {code} Note that it is using {{sctx->host}} and {{sctx->priv_user}} pair. This is wrong, they belong to different values — the first is the host part in the {{USER()}}, the second is the user part in {{CURRENT_USER()}}. See the following test case: {code:sql} create user c@localhost; create user c; grant select on mysql.* to c; connect (c,localhost,c,,,,,); select user(), current_user(); select user from mysql.user group by user; disconnect c; connection default; drop user c; drop user c@localhost; {code} Note that {{SELECT}} is allowed, while it is granted to {{c@%}}, and we're connected as {{c@localhost}}. Which suggests wildcard matching for the purpose of privilege checking. On the other hand, if the test case above is modified as {code:sql} create user ''@localhost; create user c; grant select on mysql.* to c; connect (c,localhost,c,,,,,); select user(), current_user(); --error ER_TABLEACCESS_DENIED_ERROR select user from mysql.user group by user; disconnect c; connection default; drop user c; drop user ''@localhost; {code} then the {{SELECT}} will fail. De facto, wildcard matching works for host names, but not for user names. Which is inconsistent. _Note: if this is to be fixed, all privilege checks should be analyzed and probably changed, including the one for {{SET ROLE}}_ |
The {{check_access()}} function retrieves privileges like that {code} db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, db_is_pattern); {code} Note that it is using {{sctx->host}} and {{sctx->priv_user}} pair. This is wrong, they belong to different values — the first is the host part in the {{USER()}}, the second is the user part in {{CURRENT_USER()}}. See the following test case: {code:sql} create user c@localhost; create user c@'%'; grant select on mysql.* to c@'%'; connect (c,localhost,c,,,,,); select user(), current_user(); select user from mysql.user group by user; disconnect c; connection default; drop user c@'%'; drop user c@localhost; {code} Note that {{SELECT}} is allowed, while it is granted to {{c@%}}, and we're connected as {{c@localhost}}. Which suggests wildcard matching for the purpose of privilege checking. On the other hand, if the test case above is modified as {code:sql} create user ''@localhost; create user c; grant select on mysql.* to c; connect (c,localhost,c,,,,,); select user(), current_user(); --error ER_TABLEACCESS_DENIED_ERROR select user from mysql.user group by user; disconnect c; connection default; drop user c; drop user ''@localhost; {code} then the {{SELECT}} will fail. De facto, wildcard matching works for host names, but not for user names. Which is inconsistent. _Note: if this is to be fixed, all privilege checks should be analyzed and probably changed, including the one for {{SET ROLE}}_ |
Description |
The {{check_access()}} function retrieves privileges like that {code} db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, db_is_pattern); {code} Note that it is using {{sctx->host}} and {{sctx->priv_user}} pair. This is wrong, they belong to different values — the first is the host part in the {{USER()}}, the second is the user part in {{CURRENT_USER()}}. See the following test case: {code:sql} create user c@localhost; create user c@'%'; grant select on mysql.* to c@'%'; connect (c,localhost,c,,,,,); select user(), current_user(); select user from mysql.user group by user; disconnect c; connection default; drop user c@'%'; drop user c@localhost; {code} Note that {{SELECT}} is allowed, while it is granted to {{c@%}}, and we're connected as {{c@localhost}}. Which suggests wildcard matching for the purpose of privilege checking. On the other hand, if the test case above is modified as {code:sql} create user ''@localhost; create user c; grant select on mysql.* to c; connect (c,localhost,c,,,,,); select user(), current_user(); --error ER_TABLEACCESS_DENIED_ERROR select user from mysql.user group by user; disconnect c; connection default; drop user c; drop user ''@localhost; {code} then the {{SELECT}} will fail. De facto, wildcard matching works for host names, but not for user names. Which is inconsistent. _Note: if this is to be fixed, all privilege checks should be analyzed and probably changed, including the one for {{SET ROLE}}_ |
The {{check_access()}} function retrieves privileges like that {code} db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, db_is_pattern); {code} Note that it is using {{sctx->host}} and {{sctx->priv_user}} pair. This is wrong, they belong to different values — the first is the host part in the {{USER()}}, the second is the user part in {{CURRENT_USER()}}. See the following test case: {code:sql} create user c@localhost; create user c@'%'; grant select on mysql.* to c@'%'; connect (c,localhost,c,,,,,); select user(), current_user(); select user from mysql.user group by user; disconnect c; connection default; drop user c@'%'; drop user c@localhost; {code} Note that {{SELECT}} is allowed, while it is granted to {{c@%}}, and we're connected as {{c@localhost}}. Which suggests wildcard matching for the purpose of privilege checking. On the other hand, if the test case above is modified as {code:sql} create user ''@localhost; create user c@'%'; grant select on mysql.* to c@'%'; connect (c,localhost,c,,,,,); select user(), current_user(); --error ER_TABLEACCESS_DENIED_ERROR select user from mysql.user group by user; disconnect c; connection default; drop user c@'%'; drop user ''@localhost; {code} then the {{SELECT}} will fail. De facto, wildcard matching works for host names, but not for user names. Which is inconsistent. _Note: if this is to be fixed, all privilege checks should be analyzed and probably changed, including the one for {{SET ROLE}}_ |
Fix Version/s | 10.0.9 [ 14400 ] | |
Fix Version/s | 10.0.8 [ 14200 ] |
Assignee | Sergei Golubchik [ serg ] |
Fix Version/s | 10.1.0 [ 12200 ] | |
Fix Version/s | 10.0.9 [ 14400 ] |
Workflow | defaullt [ 29601 ] | MariaDB v2 [ 45025 ] |
Fix Version/s | 10.1 [ 16100 ] | |
Fix Version/s | 10.1.0 [ 12200 ] |
Workflow | MariaDB v2 [ 45025 ] | MariaDB v3 [ 65556 ] |
Fix Version/s | 10.2 [ 14601 ] | |
Fix Version/s | 10.1 [ 16100 ] |
Fix Version/s | 10.2 [ 14601 ] |
Fix Version/s | 5.5 [ 15800 ] |
Fix Version/s | 10.4 [ 22408 ] | |
Fix Version/s | 5.5 [ 15800 ] |
Fix Version/s | 10.6 [ 24028 ] | |
Fix Version/s | 10.4 [ 22408 ] |
Workflow | MariaDB v3 [ 65556 ] | MariaDB v4 [ 139556 ] |