Sheetal Shah created ATLAS-5418:
-----------------------------------
Summary: v1 entity audit endpoint bypasses entity read
authorization
Key: ATLAS-5418
URL: https://issues.apache.org/jira/browse/ATLAS-5418
Project: Atlas
Issue Type: Bug
Components: atlas-core
Reporter: Sheetal Shah
h3. Summary
v1 entity audit API missing ENTITY_READ check allows unprivileged users to read
audit history
----
h3. Description
The v1 endpoint {{GET /api/atlas/entities/\{guid}/audit}} returns entity audit
events without performing entity read authorization. It reads the audit
repository directly after Spring Security authentication only.
The v2 endpoint {{GET /api/atlas/v2/entity/\{guid}/audit}} enforces the same
entity read access as other v2 read paths (including a path for purged entities
via audit metadata).
An authenticated user who is denied entity read on v2 can still retrieve full
v1 audit history (including attribute snapshots in event details) if they know
the entity GUID.
Impact: Unauthorized disclosure of metadata change history and historical
attribute values to any logged-in user without ENTITY_READ on that entity.
Affected code (reference): {{EntityResource.getAuditEvents()}} — no
{{AtlasAuthorizationUtils}} / entity read check before
{{{}entityAuditRepository.listEvents(){}}}. v2: {{EntityREST.getAuditEvents()}}
performs authorization before listing events.
----
h3. Environment (example — adjust as needed)
* Apache Atlas 3.0.0-SNAPSHOT (local deploy)
* File authentication + simple authorizer
* Config under {{{}{ATLAS_HOME}/conf/{}}}:
** {{{}atlas-application.properties{}}}:
{{{}atlas.authentication.method.file=true{}}}, {{atlas.authorizer.impl=simple}}
** {{{}users-credentials.properties{}}}: {{admin}} and unprivileged test user
{{bob}}
** {{{}atlas-simple-authz-policy.json{}}}: {{admin}} in {{{}userRoles{}}};
{{bob}} not in {{userRoles}}
----
h3. Steps to reproduce
# Configure auth and authorization
** In {{{}conf/atlas-application.properties{}}}, enable file auth and simple
authorizer (see above).
** In {{{}conf/users-credentials.properties{}}}, ensure {{admin}} exists and
add a test user, e.g.
{{bob=NOBODY::<sha256-hex-of-password>}}
(generate with {{{}echo -n 'bobpass' | shasum -a 256{}}}).
** In {{{}conf/atlas-simple-authz-policy.json{}}}, map only {{admin}} to
{{ROLE_ADMIN}} in {{{}userRoles{}}}. Do not add {{bob}} to {{userRoles}} or
{{{}groupRoles{}}}.
** Restart Atlas.
# Create a test entity (as admin)
{{export ATLAS=http://localhost:21000
QN="triage_$(date +%s)@cl1"
curl -s -u admin:<admin-password> -H 'Content-Type: application/json' \
-X POST "$ATLAS/api/atlas/v2/entity/bulk" \
-d
"\{\"entities\":[{\"typeName\":\"hive_db\",\"attributes\":{\"qualifiedName\":\"${QN}\",\"name\":\"triage\",\"clusterName\":\"cl1\"}}]}"}}
Note the returned GUID.
# Confirm bob is denied on v2 read paths
{{export GUID=<entity-guid>
BOB=bob:<bob-password>
curl -s -o /dev/null -w '%\{http_code}\n' -u $BOB
"$ATLAS/api/atlas/v2/entity/guid/$GUID"
curl -s -o /dev/null -w '%\{http_code}\n' -u $BOB
"$ATLAS/api/atlas/v2/entity/$GUID/audit?count=20"}}
Observed: HTTP 403 for both.
# Call v1 audit as bob
{{curl -s -o /dev/null -w '%\{http_code}\n' -u $BOB
"$ATLAS/api/atlas/entities/$GUID/audit?count=20"}}
Observed: HTTP 200 with audit events in the response body.
# Optional control — unauthenticated v1 audit
{{curl -s -o /dev/null -w '%\{http_code}\n'
"$ATLAS/api/atlas/entities/$GUID/audit?count=20"}}
Observed: HTTP 401.
----
h3. Expected result
All entity audit read paths should require ENTITY_READ (same as v2). Bob should
receive 403 on v1 audit when v2 entity read and v2 audit return 403.
----
h3. Actual result
v1 audit returns 200 to bob while v2 entity read and v2 audit return 403. Only
authentication is enforced on v1 audit, not entity read authorization.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)