Skip to content

Security: GcsArtifactService missing input validation on path components allows cross-user artifact access (CWE-22) #6115

Description

@Ashutosh0x

Summary

GcsArtifactService._get_blob_prefix() constructs GCS blob paths by directly interpolating user_id, app_name, and session_id into f-strings without any validation. A user_id containing path traversal sequences (e.g., ../other-user) allows an attacker to read, write, or delete another user's artifacts in the same GCS bucket.

Vulnerability

File: src/google/adk/artifacts/gcs_artifact_service.py, lines 156-171

python def _get_blob_prefix(self, app_name, user_id, filename, session_id=None): # No validation on app_name, user_id, or session_id if self._file_has_user_namespace(filename): return f'{app_name}/{user_id}/user/{filename}' return f'{app_name}/{user_id}/{session_id}/{filename}'

Attack

A user_id of ../victim-user constructs:
app_name/../victim-user/user/filename -> victim-user/user/filename

This allows User A to:

  • Read User B's artifacts (_load_artifact)
  • Overwrite User B's artifacts (_save_artifact)
  • Delete User B's artifacts (_delete_artifact)

Comparison with FileArtifactService

FileArtifactService in the same package already validates these inputs via _validate_path_segment() (line 141-163), which rejects path separators, .., and null bytes. GcsArtifactService lacks this validation entirely.

Impact

  • Cross-user data access in multi-tenant deployments using GCS-backed artifact storage
  • Data destruction via cross-user artifact deletion
  • CWE-22: Improper Limitation of a Pathname to a Restricted Directory

Fix

Add _validate_gcs_path_segment() with the same checks as FileArtifactService._validate_path_segment(), and call it in _get_blob_prefix() before constructing blob paths.

References

Metadata

Metadata

Labels

needs review[Status] The PR/issue is awaiting review from the maintainerservices[Component] This issue is related to runtime services, e.g. sessions, memory, artifacts, etc

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions