{"id":"CVE-2026-129166","kind":"vulnerability","aliases":["CVE-2026-129166"],"related":[],"title":"Keep: blind SQL injection via CEL filters leaks alerts and password hashes","description":"Keep 0.34.10 through 0.55.0 contains a blind SQL injection vulnerability in its CEL-to-SQL converter, which inserts bracket-indexed JSON keys from CEL filters unescaped into JSON path expressions for SQLite, PostgreSQL, and MySQL. Authenticated users with read:alert permission can submit crafted CEL expressions to /alerts/query or the cel parameter of /incidents, using result counts as a boolean oracle to extract other tenants' alerts and password hashes.","summary":"Keep 0.34.10 through 0.55.0 (reporter says 0.54.3) builds SQL from bracket-indexed JSON keys in CEL filters without escaping them. An authenticated user with read:alert permission can extract other tenants' alerts and password hashes one boolean answer at a time. No released fix yet; a community PR (#6924) is open and not merged.","severity":"high","cvss":7.1,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"keep","fixed":[],"affected":">= 0.34.10, <= 0.55.0","ecosystem":"pip"}],"ecosystems":[],"tags":["cel","keep","multi-tenant","other","self-hosted","sql-injection"],"not_affected_if":["no-read-alert-users","no-untrusted-read-alert-users","version-outside-range"],"how_to_check":"- Check your Keep version: 0.34.10 through 0.55.0 is affected per VulnCheck (the reporter lists up to 0.54.3).\n- Who has read:alert? Any such account can reach /alerts/query and /incidents?cel=. Review those accounts, and your reverse proxy logs for CEL expressions with a quote (') inside square-bracket keys.\n- Applies on SQLite, PostgreSQL and MySQL backends.","fix":"No released fix as of 2026-11-13. Upstream PR keephq/keep#6924 is open and unmerged; watch it and the Keep releases page and upgrade to the first release that includes it. Until then, limit read:alert to trusted users.","status":"open","published_at":"2026-11-13T18:17:41+00:00","first_seen_at":"2026-11-13T18:49:31+00:00","triaged_at":"2026-11-13T18:51:31+00:00","updated_at":"2026-11-13T18:53:47+00:00","category":"other","confidence":0.75,"triage":{"at":"2026-11-13T18:51:31Z","model":"claude-haiku-5-5","output":{"fix":"unknown","reach":"network","title":"Keep: blind SQL injection via CEL filters leaks alerts and password hashes","impact":"high","summary":"Keep 0.34.10 through 0.55.0 builds SQL from bracket-indexed JSON keys in CEL filters without escaping them. An authenticated user with read:alert permission can extract other tenants' alerts and password hashes one boolean answer at a time.","audience":"businesses","category":"other","nicknames":[],"who_cares":["keep","sql-injection","multi-tenant"],"confidence":0.6,"fix_status":"unknown","needs_auth":"yes","worst_case":"other tenants' alerts and password hashes can be extracted","analyst_note":"Find the fixed Keep version and the upstream advisory; the only linked source is a VulnCheck third-party advisory page, so confirm the fix version from it or the Keep release notes.","how_to_check":"- Check the installed Keep version against the affected range 0.34.10 through 0.55.0.\n- unknown for other checks; the sources do not say which config or endpoint must be exposed beyond the affected versions.","plain_action":"","product_name":"","needs_analyst":true,"not_affected_if":["version-outside-range","no-read-alert-users"],"who_is_affected":"Teams running Keep in the affected version range where users hold read:alert permission. The flaw sits in the CEL-to-SQL converter used by /alerts/query and the cel parameter of /incidents, on SQLite, PostgreSQL and MySQL backends. Deployments outside the range, or where only fully trusted users can read alerts, are less exposed.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"no","severity_if_unknown":"high"},"cost_usd":0.000761,"input_tokens":4663,"output_tokens":589,"severity_before":"high"},"analyst_status":"done","analyst_note":"Find the fixed Keep version and the upstream advisory; the only linked source is a VulnCheck third-party advisory page, so confirm the fix version from it or the Keep release notes.","search":"'-129166':15A,18A '-2026':14A,17A '/alerts/query':136C '/incidents':142C '0.34.10':33B,88C '0.54.3':38B '0.55.0':35B,90C '6924':81B 'alert':9A,58B,64B,128C,154C 'answer':70B 'authent':54B,124C 'blind':2A,93C 'boolean':69B,148C 'bracket':43B,107C 'bracket-index':42B,106C 'build':39B 'cel':6A,20B,48B,100C,112C,133C,139C 'cel-to-sql':99C 'communiti':79B 'contain':91C 'convert':103C 'count':145C 'craft':132C 'cve':13A,16A 'escap':51B 'express':118C,134C 'extract':61B,151C 'filter':7A,49B,113C 'fix':76B 'hash':12A,67B,157C 'host':28B 'index':44B,108C 'inject':4A,31B,95C 'insert':105C 'json':45B,109C,116C 'keep':1A,19A,21B,32B,87C 'key':46B,110C 'leak':8A 'merg':86B 'multi':23B 'multi-ten':22B 'mysql':123C 'one':68B 'open':83B 'oracl':149C 'paramet':140C 'password':11A,66B,156C 'path':117C 'permiss':59B,129C 'postgresql':121C 'pr':80B 'read':57B,127C 'releas':75B 'report':36B 'result':144C 'say':37B 'self':27B 'self-host':26B 'sql':3A,30B,40B,94C,102C 'sql-inject':29B 'sqlite':120C 'submit':131C 'tenant':24B,63B,153C 'time':73B 'unescap':114C 'use':143C 'user':55B,125C 'via':5A 'vulner':96C 'without':50B 'yet':77B","nicknames":[],"mitigations":[],"who_affected":"Self-hosted Keep deployments from 0.34.10 through 0.55.0 where more than one party holds read:alert (multi-tenant setups especially). The flaw is in the CEL-to-SQL converter behind /alerts/query and the cel parameter of /incidents, on SQLite, PostgreSQL and MySQL. Single-team installs where every read:alert user is trusted are less exposed.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"none","audience":"businesses","plain_action":null,"pkeys":["keep"],"ptokens":["keep"],"labels":["cel","high","keep","multitenant","other","selfhosted","sqlinjection"],"campaign_type":null,"search_a":"'-129166':15A,18A '-2026':14A,17A 'alert':9A 'blind':2A 'cel':6A 'cve':13A,16A 'filter':7A 'hash':12A 'inject':4A 'keep':1A,19A 'leak':8A 'password':11A 'sql':3A 'via':5A","search_b":"'0.34.10':33B '0.54.3':38B '0.55.0':35B '6924':81B 'alert':58B,64B 'answer':70B 'authent':54B 'boolean':69B 'bracket':43B 'bracket-index':42B 'build':39B 'cel':20B,48B 'communiti':79B 'escap':51B 'extract':61B 'filter':49B 'fix':76B 'hash':67B 'host':28B 'index':44B 'inject':31B 'json':45B 'keep':21B,32B 'key':46B 'merg':86B 'multi':23B 'multi-ten':22B 'one':68B 'open':83B 'password':66B 'permiss':59B 'pr':80B 'read':57B 'releas':75B 'report':36B 'say':37B 'self':27B 'self-host':26B 'sql':30B,40B 'sql-inject':29B 'tenant':24B,63B 'time':73B 'user':55B 'without':50B 'yet':77B","search_c":"'/alerts/query':136C '/incidents':142C '0.34.10':88C '0.55.0':90C 'alert':128C,154C 'authent':124C 'blind':93C 'boolean':148C 'bracket':107C 'bracket-index':106C 'cel':100C,112C,133C,139C 'cel-to-sql':99C 'contain':91C 'convert':103C 'count':145C 'craft':132C 'express':118C,134C 'extract':151C 'filter':113C 'hash':157C 'index':108C 'inject':95C 'insert':105C 'json':109C,116C 'keep':87C 'key':110C 'mysql':123C 'oracl':149C 'paramet':140C 'password':156C 'path':117C 'permiss':129C 'postgresql':121C 'read':127C 'result':144C 'sql':94C,102C 'sqlite':120C 'submit':131C 'tenant':153C 'unescap':114C 'use':143C 'user':125C 'vulner':96C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-13T18:17:41+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"disclosure@vulncheck.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-129166","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-129166","severity":null,"published_at":"2026-11-13T18:17:41+00:00","modified_at":"2026-11-13T18:17:41+00:00","first_seen_at":"2026-11-13T18:49:31+00:00","fetched_at":"2026-11-13T18:49:31+00:00","note":null},{"source":"analyst","external_id":"CVE-2026-129166:3922","url":"https://github.com/keephq/keep/issues/6902","severity":null,"published_at":"2026-11-13T18:53:47+00:00","modified_at":"2026-11-13T18:53:47+00:00","first_seen_at":"2026-11-13T18:53:47+00:00","fetched_at":"2026-11-13T18:53:47+00:00","note":"No released fix found: upstream issue keephq/keep#6902 is open, community PR #6924 (escapes JSON path keys) is open and unmerged as of 2026-11-13; releases page shows nothing newer. Reporter says affected 0.34.10-0.54.3, VulnCheck says through 0.55.0. No PoC link beyond reporter's report; not exploited. Nothing verified: no maintainer statement.","cites":["https://github.com/keephq/keep/issues/6902","https://github.com/keephq/keep/pull/6924","https://vul.yulun.ac.cn/20261030/keephq_keep/"]}],"documents":[{"id":148623,"url":"https://www.vulncheck.com/advisories/keep-0.34.10-through-0.55.0-blind-sql-injection-via-cel-bracket-indexed-json-keys","title":"Third-party advisory: www.vulncheck.com","kind":"advisory","source":"nvd","publisher":"research","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Third-party advisory: www.vulncheck.com"},{"id":148659,"url":"https://github.com/keephq/keep/issues/6902","title":"keephq/keep #6902 Boolean-Based Blind SQL Injection in CEL Queries","kind":"issue","source":"analyst","publisher":null,"text":null,"published_at":null,"relation":"advisory","confidence":null,"note":null},{"id":148660,"url":"https://github.com/keephq/keep/pull/6924","title":"keephq/keep PR #6924 fix(cel): escape JSON path keys (open, unmerged)","kind":"issue","source":"analyst","publisher":null,"text":null,"published_at":null,"relation":"fix","confidence":null,"note":null},{"id":148661,"url":"https://vul.yulun.ac.cn/20261030/keephq_keep/","title":"Keep Vulnerability Report (Wu Yulun)","kind":"blog","source":"analyst","publisher":null,"text":null,"published_at":null,"relation":"describes","confidence":null,"note":null}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}