{
 "month": "2026-05",
 "generated": "2026-10-06T12:05+00:00",
 "majors": {
  "14": {
   "counts": {
    "announced": 1,
    "certain": 1,
    "probable": 0,
    "not_published": 0,
    "not_covered": 0,
    "awaiting": 0
   },
   "advisories": [
    {
     "cve": "CVE-2026-0073",
     "osv_id": "ASB-A-469080888",
     "source": "osv",
     "announced": "2026-05-01",
     "severity": "Critical",
     "types": [
      "RCE"
     ],
     "status": "resolved",
     "brief": {
      "summary": "In adbd's TLS client-certificate verification (daemon/auth.cpp, adbd_tls_verify_cert), the EVP_PKEY_cmp result now counts as a key match only when it is exactly 1, not for any non-zero value. Error and non-comparable return codes are no longer treated as a match.",
      "confidence": "high",
      "backport_notes": [
       "Single-hunk, self-contained change. The essential part is replacing the truthiness test with `cmp_result == 1`. Only the log lines differ between trees (LOG(INFO) vs VLOG(AUTH))."
      ],
      "meta": {
       "generated": "2026-10-03",
       "author_model": "claude-fable-5-1",
       "review_model": "claude-opus-5-5",
       "review_corrections": 4,
       "note": "AI-generated from the bulletin, the fixing diffs and their code context, then checked claim by claim by a second model. Statements marked '(general platform knowledge)' are not taken from the material."
      }
     },
     "method": [
      "bug_id"
     ],
     "confidence": "certain",
     "first_fix": {
      "tag": "android-security-14.0.0_r27",
      "date": "2026-05-04",
      "provenance": "security_tag"
     },
     "last_fix": {
      "tag": "android-security-14.0.0_r27",
      "date": "2026-05-04",
      "provenance": "security_tag"
     },
     "public_commits": [
      {
       "project": "platform/packages/modules/adb",
       "sha": "4492fa1affa1ceb00c198ac68c4d5d194c1e480d",
       "tag": "android-security-14.0.0_r27",
       "provenance": "security_tag",
       "method": "bug_id",
       "confidence": "certain",
       "evidence": null,
       "similarity": null
      }
     ],
     "n_public_commits": 1,
     "projects": [
      "platform/packages/modules/adb"
     ]
    }
   ],
   "tags": [
    "android-security-14.0.0_r27"
   ],
   "unannounced": [],
   "coverage": {
    "n_ingested_tags": 30,
    "first_ingested_tag": "android-security-14.0.0_r1",
    "latest_ingested_tag": "android-security-14.0.0_r30",
    "window_base_tag": "android-14.0.0_r1",
    "window_start": "2023-10-04",
    "partial_tags": []
   },
   "platform_update_tags": {},
   "briefs": {
    "CVE-2026-0073": {
     "cve": "CVE-2026-0073",
     "summary": "In adbd's TLS client-certificate verification (daemon/auth.cpp, adbd_tls_verify_cert), the EVP_PKEY_cmp result now counts as a key match only when it is exactly 1, not for any non-zero value. Error and non-comparable return codes are no longer treated as a match.",
     "component": "platform/packages/modules/adb, adbd daemon TLS authentication (daemon/auth.cpp)",
     "weakness": "Incorrect check of a function return value (truthiness test on a comparison that can return error codes), leading to an authentication bypass",
     "root_cause": "adbd_tls_verify_cert goes through the stored authorized public keys (IteratePublicKeys). It decodes each one into an RSA key wrapped in an EVP_PKEY (known_evp) and compares it with EVP_PKEY_cmp against the public key taken from the peer's X509 certificate (evp_pkey). The original code used `if (EVP_PKEY_cmp(...))`, so every non-zero return counted as a match. The commit message says \"Not all non-zero values mean success\". In BoringSSL/OpenSSL, EVP_PKEY_cmp returns 1 for a match and negative values when the keys cannot be compared, for example because the key types differ (general platform knowledge). With the truthiness test, any non-zero non-1 result set verified = true, set *auth_key to the stored key and made the function return 1 (authorized). A certificate whose key did not actually match a stored key could therefore be accepted by this check.",
     "fix_analysis": [
      "daemon/auth.cpp:adbd_tls_verify_cert: the return value of EVP_PKEY_cmp(known_evp.get(), evp_pkey.get()) is stored in `int cmp_result`, and the match branch is taken only when `cmp_result == 1`. Every other value goes to the non-match branch, which leaves verified = false and authorized unchanged.",
      "daemon/auth.cpp:adbd_tls_verify_cert: the non-match log line now appends `EVP_PKEY_cmp returned <cmp_result>`. No other logic changed."
     ],
     "completeness": [
      "The fix covers the single EVP_PKEY_cmp call in adbd_tls_verify_cert, which is the only key comparison shown in the material. The surrounding loop, the base64 and decode error paths and the final `return authorized ? 1 : 0` are unchanged.",
      "The return value of EVP_PKEY_set1_RSA(known_evp.get(), key) in the same block is still unchecked. With the fix, any EVP_PKEY_cmp result other than 1 is treated as a non-match.",
      "The diff includes no test. The commit points to a test in b/469080888#comment6, which is not provided."
     ],
     "behavior_changes": [
      "Stricter acceptance: adbd_tls_verify_cert now authorizes the peer certificate only when EVP_PKEY_cmp returns exactly 1. Any other result is treated as a mismatch, and if no stored key matches, the function returns 0.",
      "The log message on mismatch now includes the numeric EVP_PKEY_cmp return value (LOG(INFO) on 14 and 15, VLOG(AUTH) on 16)."
     ],
     "preconditions": [
      "adbd's TLS authentication path must be reached. Per index search, FdConnection::DoTlsHandshake in packages/modules/adb/transport.cpp creates a TlsConnection in the Server role on the device (non-ADB_HOST build).",
      "The device must have at least one stored authorized adb public key that IteratePublicKeys returns and that android_pubkey_decode decodes successfully, because the comparison runs once per stored key.",
      "The peer's certificate public key must make EVP_PKEY_cmp against the stored RSA key return a non-zero value other than 1."
     ],
     "per_major": {
      "14": "same fix: commit 4492fa1affa1 in android-security-14.0.0_r27 (LOG(INFO) variant). At android-security-14.0.0_r29, 5 of 7 lines of the patched region are present, and the code shown contains the cmp_result == 1 check.",
      "15": "same fix: commit 7cd495a9b4b7 in android-security-15.0.0_r15, with a diff identical to 14. At android-security-15.0.0_r17, 5 of 7 lines of the patched region are present.",
      "16": "adapted fix: commit 842d331f9e5f in android-security-16.0.0_r6. The logic change is the same, but the log statements use VLOG(AUTH) instead of LOG(INFO). At android-security-16.0.0_r8, 5 of 7 lines of the patched region are present.",
      "17": "not affected per the bulletin (not listed). The per-major facts show 4 of 7 lines of the patched region at android-security-17.0.0_r1, and the material does not explain this further."
     },
     "backport_notes": [
      "Single-hunk, self-contained change. The essential part is replacing the truthiness test with `cmp_result == 1`. Only the log lines differ between trees (LOG(INFO) vs VLOG(AUTH))."
     ],
     "confidence": "high",
     "unknowns": [
      "Which EVP_PKEY_cmp return values can occur in practice with the BoringSSL version in each branch.",
      "How adbd_tls_verify_cert is registered as the verification callback for the TLS server connection (the index snippet does not show it).",
      "Why Android 17 is not listed, and what its code at android-security-17.0.0_r1 looks like (only a 4/7 line match is reported).",
      "The content of the referenced test (b/469080888#comment6)."
     ],
     "meta": {
      "generated": "2026-10-03",
      "author_model": "claude-fable-5-1",
      "review_model": "claude-opus-5-5",
      "review_corrections": 4,
      "note": "AI-generated from the bulletin, the fixing diffs and their code context, then checked claim by claim by a second model. Statements marked '(general platform knowledge)' are not taken from the material."
     }
    }
   }
  },
  "15": {
   "counts": {
    "announced": 1,
    "certain": 1,
    "probable": 0,
    "not_published": 0,
    "not_covered": 0,
    "awaiting": 0
   },
   "advisories": [
    {
     "cve": "CVE-2026-0073",
     "osv_id": "ASB-A-469080888",
     "source": "osv",
     "announced": "2026-05-01",
     "severity": "Critical",
     "types": [
      "RCE"
     ],
     "status": "resolved",
     "brief": {
      "summary": "In adbd's TLS client-certificate verification (daemon/auth.cpp, adbd_tls_verify_cert), the result of EVP_PKEY_cmp now counts as a match only when it equals exactly 1. Before the fix, any non-zero return was treated as a successful key match.",
      "confidence": "high",
      "backport_notes": [
       "This is a single, self-contained commit changing daemon/auth.cpp:adbd_tls_verify_cert. It applies to any branch that still has the `if (EVP_PKEY_cmp(known_evp.get(), evp_pkey.get()))` pattern. Only the logging macro differs between branches (LOG(INFO) on 14/15, VLOG(AUTH) on 16), so adjust the log line to the local macro."
      ],
      "meta": {
       "generated": "2026-10-02",
       "author_model": "claude-fable-5-1",
       "review_model": "claude-opus-5-5",
       "review_corrections": 7,
       "note": "AI-generated from the bulletin, the fixing diffs and their code context, then checked claim by claim by a second model. Statements marked '(general platform knowledge)' are not taken from the material."
      }
     },
     "method": [
      "bug_id"
     ],
     "confidence": "certain",
     "first_fix": {
      "tag": "android-security-15.0.0_r15",
      "date": "2026-05-04",
      "provenance": "security_tag"
     },
     "last_fix": {
      "tag": "android-security-15.0.0_r15",
      "date": "2026-05-04",
      "provenance": "security_tag"
     },
     "public_commits": [
      {
       "project": "platform/packages/modules/adb",
       "sha": "7cd495a9b4b7fee6c30238f35ca9ec0a3989563d",
       "tag": "android-security-15.0.0_r15",
       "provenance": "security_tag",
       "method": "bug_id",
       "confidence": "certain",
       "evidence": null,
       "similarity": null
      }
     ],
     "n_public_commits": 1,
     "projects": [
      "platform/packages/modules/adb"
     ]
    }
   ],
   "tags": [
    "android-security-15.0.0_r15"
   ],
   "unannounced": [],
   "coverage": {
    "n_ingested_tags": 18,
    "first_ingested_tag": "android-security-15.0.0_r1",
    "latest_ingested_tag": "android-security-15.0.0_r18",
    "window_base_tag": "android-15.0.0_r1",
    "window_start": "2024-09-03",
    "partial_tags": []
   },
   "platform_update_tags": {},
   "briefs": {
    "CVE-2026-0073": {
     "cve": "CVE-2026-0073",
     "summary": "In adbd's TLS client-certificate verification (daemon/auth.cpp, adbd_tls_verify_cert), the result of EVP_PKEY_cmp now counts as a match only when it equals exactly 1. Before the fix, any non-zero return was treated as a successful key match.",
     "component": "platform/packages/modules/adb, adbd daemon TLS authentication (daemon/auth.cpp)",
     "weakness": "Improper check of a function return value, leading to authentication bypass (a non-zero, non-1 return of EVP_PKEY_cmp was treated as a key match)",
     "root_cause": "adbd_tls_verify_cert uses EVP_PKEY_cmp to compare the public key from the peer's X509 certificate (evp_pkey) against each known authorized key (known_evp, built from the RSA key decoded from the adb key store). The old code treated the return value as a boolean: `if (EVP_PKEY_cmp(known_evp.get(), evp_pkey.get()))`. The commit message says that not all non-zero values from EVP_PKEY_cmp mean success. Any non-zero return other than 1 therefore satisfied the old condition: it set verified = true, stored the key in *auth_key, and made the function return 1 (certificate accepted). As a result, a peer certificate that did not carry an authorized key could pass adbd's TLS certificate verification.",
     "fix_analysis": [
      "daemon/auth.cpp:adbd_tls_verify_cert: the return value of EVP_PKEY_cmp(known_evp.get(), evp_pkey.get()) is stored in `int cmp_result`, and the match branch is taken only when `cmp_result == 1`. Any other value now goes to the non-match branch. verified stays false and the loop moves to the next known key. If no key matches, the function returns 0 (certificate rejected).",
      "daemon/auth.cpp:adbd_tls_verify_cert: the non-match log line now includes the numeric cmp_result (\"EVP_PKEY_cmp returned N\"). This is for diagnostics only and has no functional effect."
     ],
     "completeness": [
      "The fix covers the single EVP_PKEY_cmp call site in adbd_tls_verify_cert, which is the only EVP_PKEY_cmp use shown in the material. It changes the acceptance condition from non-zero to exactly 1 for every known key iterated.",
      "The surrounding logic is unchanged. The return value of EVP_PKEY_set1_RSA(known_evp.get(), key) is still not checked at this site, but with the stricter comparison only a result of exactly 1 can produce a match.",
      "No other comparison or verification paths are modified. The material does not show any other callers of EVP_PKEY_cmp, in the adb project or elsewhere."
     ],
     "behavior_changes": [
      "Stricter certificate verification: when the public key comparison returns anything other than 1, the peer certificate is now rejected (the verify function returns 0) instead of accepted.",
      "On a mismatch, the log message now appends the EVP_PKEY_cmp return value (LOG(INFO) on 14/15, VLOG(AUTH) on 16).",
      "No API, protocol or data format changes are shown in the diff."
     ],
     "preconditions": [
      "adbd must run the TLS-based transport. Per index search, FdConnection::DoTlsHandshake in packages/modules/adb/transport.cpp creates a server-role TlsConnection in non-ADB_HOST builds. The snippet is cut off, so it does not show adbd_tls_verify_cert being registered as its verify callback.",
      "A peer must present a client certificate during the TLS handshake. The bulletin classifies the issue as RCE.",
      "At least one authorized key must be present in the adb key store, so that IteratePublicKeys reaches the EVP_PKEY_cmp comparison. Otherwise authorized stays false.",
      "EVP_PKEY_cmp must return a non-zero value other than 1 for the peer certificate's key against a stored key. The material does not say which inputs do this."
     ],
     "per_major": {
      "14": "same fix: platform/packages/modules/adb 4492fa1affa1 in android-security-14.0.0_r27. The diff is identical to the Android 15 commit (LOG(INFO) variant, same blob hashes d2f6d6bb -> 05f51801).",
      "15": "same fix: platform/packages/modules/adb 7cd495a9b4b7 in android-security-15.0.0_r15, a cherry-pick of 8248d2b1f479 (Change-Id I20f3abf93ab9bd0bd349d17cce2ba7f56fa88e36). The code context at android-security-15.0.0_r17 shows the patched check (cmp_result == 1). The per-major facts report 5/7 lines of the patched region present there.",
      "16": "adapted fix: platform/packages/modules/adb 842d331f9e5f in android-security-16.0.0_r6. The logic change is the same (cmp_result == 1), but the log statements use VLOG(AUTH) instead of LOG(INFO).",
      "17": "not affected (not listed by the bulletin). At android-security-17.0.0_r1, 4/7 lines of the patched region are present."
     },
     "backport_notes": [
      "This is a single, self-contained commit changing daemon/auth.cpp:adbd_tls_verify_cert. It applies to any branch that still has the `if (EVP_PKEY_cmp(known_evp.get(), evp_pkey.get()))` pattern. Only the logging macro differs between branches (LOG(INFO) on 14/15, VLOG(AUTH) on 16), so adjust the log line to the local macro."
     ],
     "confidence": "high",
     "unknowns": [
      "Which EVP_PKEY_cmp return values other than 1 occur in this code path, and which certificate or key inputs produce them, is not shown.",
      "The exact state of adbd_tls_verify_cert on Android 17 is not shown; only a partial line match is reported.",
      "The referenced test (b/469080888#comment6) is not included in the material.",
      "Whether the fix is also delivered through an adb module update, rather than only through platform security tags, is not shown.",
      "The material does not show that adbd_tls_verify_cert is registered as the TLS verify callback in transport.cpp."
     ],
     "meta": {
      "generated": "2026-10-02",
      "author_model": "claude-fable-5-1",
      "review_model": "claude-opus-5-5",
      "review_corrections": 7,
      "note": "AI-generated from the bulletin, the fixing diffs and their code context, then checked claim by claim by a second model. Statements marked '(general platform knowledge)' are not taken from the material."
     }
    }
   }
  },
  "16": {
   "counts": {
    "announced": 1,
    "certain": 1,
    "probable": 0,
    "not_published": 0,
    "not_covered": 0,
    "awaiting": 0
   },
   "advisories": [
    {
     "cve": "CVE-2026-0073",
     "osv_id": "ASB-A-469080888",
     "source": "osv",
     "announced": "2026-05-01",
     "severity": "Critical",
     "types": [
      "RCE"
     ],
     "status": "resolved",
     "brief": {
      "summary": "adbd's TLS client-certificate verification in daemon/auth.cpp adbd_tls_verify_cert now treats only an EVP_PKEY_cmp return value of exactly 1 as a key match, instead of any non-zero value.",
      "confidence": "high",
      "backport_notes": [
       "This is a single, self-contained two-line logic change in daemon/auth.cpp adbd_tls_verify_cert. The only difference between branches is the logging macro (LOG(INFO) on 14/15, VLOG(AUTH) on 16), so adapt the log lines to the macro the target branch uses."
      ],
      "meta": {
       "generated": "2026-10-04",
       "author_model": "claude-fable-5-1",
       "review_model": "claude-opus-5-5",
       "review_corrections": 9,
       "note": "AI-generated from the bulletin, the fixing diffs and their code context, then checked claim by claim by a second model. Statements marked '(general platform knowledge)' are not taken from the material."
      }
     },
     "method": [
      "bug_id"
     ],
     "confidence": "certain",
     "first_fix": {
      "tag": "android-security-16.0.0_r6",
      "date": "2026-05-04",
      "provenance": "security_tag"
     },
     "last_fix": {
      "tag": "android-security-16.0.0_r6",
      "date": "2026-05-04",
      "provenance": "security_tag"
     },
     "public_commits": [
      {
       "project": "platform/packages/modules/adb",
       "sha": "842d331f9e5fb10770a09379e19240daea057dba",
       "tag": "android-security-16.0.0_r6",
       "provenance": "security_tag",
       "method": "bug_id",
       "confidence": "certain",
       "evidence": null,
       "similarity": null
      }
     ],
     "n_public_commits": 1,
     "projects": [
      "platform/packages/modules/adb"
     ]
    }
   ],
   "tags": [
    "android-security-16.0.0_r6"
   ],
   "unannounced": [],
   "coverage": {
    "n_ingested_tags": 9,
    "first_ingested_tag": "android-security-16.0.0_r1",
    "latest_ingested_tag": "android-security-16.0.0_r9",
    "window_base_tag": "android-16.0.0_r2",
    "window_start": "2025-06-10",
    "partial_tags": []
   },
   "platform_update_tags": {},
   "briefs": {
    "CVE-2026-0073": {
     "cve": "CVE-2026-0073",
     "summary": "adbd's TLS client-certificate verification in daemon/auth.cpp adbd_tls_verify_cert now treats only an EVP_PKEY_cmp return value of exactly 1 as a key match, instead of any non-zero value.",
     "component": "platform/packages/modules/adb, adbd daemon TLS authentication (daemon/auth.cpp)",
     "weakness": "Improper check of function return value in an authentication decision (a non-success return treated as success), affecting authentication",
     "root_cause": "In adbd_tls_verify_cert, the public key of the peer's X509 certificate (evp_pkey) is compared with EVP_PKEY_cmp against each known key (known_evp, decoded as RSA from the keys enumerated by IteratePublicKeys). The old code used the result as a boolean: `if (EVP_PKEY_cmp(known_evp.get(), evp_pkey.get()))`. As the commit message states, \"Not all non-zero values mean success\". Any non-zero result other than 1 was therefore treated as a match: verified was set to true, *auth_key was written, and the function returned 1 (authorized), even though the keys had not been confirmed equal.",
     "fix_analysis": [
      "daemon/auth.cpp:adbd_tls_verify_cert: the EVP_PKEY_cmp result is stored in `int cmp_result` and the match branch is taken only when `cmp_result == 1`. Every other value falls into the non-match branch, so verified stays false and the key is not accepted.",
      "daemon/auth.cpp:adbd_tls_verify_cert: the non-match log line now includes the raw cmp_result value (\"EVP_PKEY_cmp returned N\") for diagnostics. There is no other logic change."
     ],
     "completeness": [
      "The fix covers the single EVP_PKEY_cmp call in adbd_tls_verify_cert, which is the only key comparison in the shown code. The function's overall return (authorized ? 1 : 0) and the surrounding b64_pton/android_pubkey_decode checks are unchanged.",
      "The surrounding code still decodes stored keys only as RSA (android_pubkey_decode, EVP_PKEY_set1_RSA). The fix does not add an explicit check on the type of the peer certificate's key; it relies on the strict == 1 comparison instead.",
      "The commit changes only daemon/auth.cpp and adds no test; it points to a bug comment for testing."
     ],
     "behavior_changes": [
      "Peer certificates whose key comparison returns a value other than 1 are now rejected during adbd TLS certificate verification instead of being accepted.",
      "The auth log on mismatch now includes the numeric EVP_PKEY_cmp result."
     ],
     "preconditions": [
      "adbd must accept a TLS connection so that adbd_tls_verify_cert runs as server-side certificate verification. Per index search, FdConnection::DoTlsHandshake creates a TlsConnection in Role::Server on the device (non-host) side.",
      "At least one public key must be enumerated by IteratePublicKeys and decode successfully; otherwise the comparison is never reached.",
      "A peer must present a certificate whose public key makes EVP_PKEY_cmp return a non-zero value other than 1."
     ],
     "per_major": {
      "14": "same fix: platform/packages/modules/adb 4492fa1affa1 in android-security-14.0.0_r27. The logic change is identical to Android 16; the surrounding log statements use LOG(INFO) instead of VLOG(AUTH). 5/7 lines of the patched region are present at android-security-14.0.0_r29.",
      "15": "same fix: platform/packages/modules/adb 7cd495a9b4b7 in android-security-15.0.0_r15, the same hunk as Android 14 (LOG(INFO) variant). 5/7 lines of the patched region are present at android-security-15.0.0_r17.",
      "16": "same fix: platform/packages/modules/adb 842d331f9e5f in android-security-16.0.0_r6 (cherry-pick of 8248d2b1f479), VLOG(AUTH) variant. 5/7 lines of the patched region are present at android-security-16.0.0_r8, and the code there shows the cmp_result == 1 check.",
      "17": "not affected per the bulletin (not listed). 5/7 lines of the patched region are present at android-security-17.0.0_r1."
     },
     "backport_notes": [
      "This is a single, self-contained two-line logic change in daemon/auth.cpp adbd_tls_verify_cert. The only difference between branches is the logging macro (LOG(INFO) on 14/15, VLOG(AUTH) on 16), so adapt the log lines to the macro the target branch uses."
     ],
     "confidence": "high",
     "unknowns": [
      "The material does not show which EVP_PKEY_cmp return values other than 0 and 1 occur, or what conditions cause them in the deployed BoringSSL.",
      "The test referenced in b/469080888#comment6 is not shown.",
      "The source of the keys enumerated by IteratePublicKeys is not shown.",
      "The material does not show whether an APEX (mainline module) release of adbd carried this fix independently of the platform security tags.",
      "For Android 17 and the latest tags, the material does not show which 2 of the 7 patched-region lines are missing."
     ],
     "meta": {
      "generated": "2026-10-04",
      "author_model": "claude-fable-5-1",
      "review_model": "claude-opus-5-5",
      "review_corrections": 9,
      "note": "AI-generated from the bulletin, the fixing diffs and their code context, then checked claim by claim by a second model. Statements marked '(general platform knowledge)' are not taken from the material."
     }
    }
   }
  },
  "17": {
   "counts": {
    "announced": 0,
    "certain": 0,
    "probable": 0,
    "not_published": 0,
    "not_covered": 0,
    "awaiting": 0
   },
   "advisories": [],
   "tags": [],
   "unannounced": [],
   "coverage": {
    "n_ingested_tags": 2,
    "first_ingested_tag": "android-security-17.0.0_r1",
    "latest_ingested_tag": "android-security-17.0.0_r2",
    "window_base_tag": "android-17.0.0_r1",
    "window_start": "2026-06-16",
    "partial_tags": []
   },
   "platform_update_tags": {},
   "briefs": {}
  }
 },
 "bulletin": {
  "url": "https://source.android.com/docs/security/bulletin/2026/2026-05-01",
  "latest_version": "1.1",
  "latest_revision": {
   "version": "1.1",
   "date": "May 7, 2026",
   "notes": "AOSP links added"
  },
  "revisions": [
   {
    "version": "1.0",
    "date": "May 4, 2026",
    "notes": "Bulletin published"
   },
   {
    "version": "1.1",
    "date": "May 7, 2026",
    "notes": "AOSP links added"
   }
  ],
  "tracked_since": "2026-09-30",
  "changes_since_tracking": [],
  "out_of_scope_rows": {},
  "note": "changes are only visible from `tracked_since`; earlier revisions of the bulletin cannot be reconstructed. Out-of-scope rows (vendor closed-source, kernel) have no public AOSP code to resolve."
 }
}