Uh oh!
There was an error while loading. Please reload this page.
feat(materials): add OVERSECURED_JSON material type - #3370
Conversation
Adds a first-class material type for Oversecured mobile (Android/iOS) scan reports, so the whole-scan JSON export can be recorded and policy evaluated instead of being wrapped by hand as generic EVIDENCE. The crafter validates the export envelope (scan id, app platform, findings array) and uploads the report as-is. It is kept out of auto-detection: the export envelope is not published by the vendor, so it must be referenced with an explicit --kind OVERSECURED_JSON or from a workflow contract. Refs #3369 Assisted-by: Claude Code Signed-off-by: Miguel Martinez Trivino <miguel@chainloop.dev> Chainloop-Trace-Sessions: 35d950a5-8e3c-4904-94e8-f29c3605b0eb
AI Session Checks — 🟢 88% · ✅ 0 failing
|
| Status | Policy | Material | Messages |
|---|---|---|---|
| ✅ Passed | ai-config-ai-agents-allowed | ai-coding-session-35d950 | - |
| ✅ Passed | ai-config-no-dangerous-commands | ai-coding-session-35d950 | - |
| ✅ Passed | ai-config-no-secrets | ai-coding-session-35d950 | - |
| ✅ Passed | ai-config-mcp-servers-allowed | ai-coding-session-35d950 | - |
Security Checks — ✅ 6 passing
✅ iac-scan
| Status | Policy | Messages |
|---|---|---|
| ✅ Passed | iac-misconfiguration | - |
| ✅ Passed | iac-misconfiguration | - |
PR info
| Status | Policy | Messages |
|---|---|---|
| ✅ Passed | pr-description-required | - |
| ✅ Passed | pr-description-required | - |
| ✅ Passed | pr-user-story-linked | - |
| ✅ Passed | pr-user-story-linked | - |
⏭️ 2 scans not applied
| Scan | Reason |
|---|---|
vulnerability-scan | no manifest/lockfile changed |
github-actions-scan | no workflow files changed |
Powered by Chainloop and Chainloop Trace
Uh oh!
There was an error while loading. Please reload this page.
Closes#3369
Adds a first-class material type for Oversecured mobile (Android/iOS) scan reports. Until now the only way to attest one was the generic
EVIDENCEkind with a hand-written wrapper, which pushed the wrapping onto every caller and skipped validation at craft time. Oversecured has no SARIF output, so the report cannot be routed through the existingSARIFkind either.The accepted input is the whole-scan JSON export (
oversecured report <scanId> --app <appId> --format json). The crafter validates the export envelope — a scan id, an app platform, and a findings array that may be empty or null for a clean scan — and then uploads the report unchanged. Validation stops at the envelope: the findings carry decompiled sources and DAST heap snapshots that make up nearly all of a multi-MB export, and nothing in them identifies the tool better than the header does.The kind is deliberately kept out of auto-detection, so it must be referenced with an explicit
--kind OVERSECURED_JSONor from a workflow contract. The vendor does not publish the export envelope, so pinning it into the detection order would bet every other JSON kind on a shape inferred from a sample. The exclusions in that list are now consolidated into one comment block and pinned by a test.The material carries the
chainloop.material.tool.nameannotation only. The export omits the per-findinghasSast/hasDastflags that exist on the API's findings-list and single-finding responses, and states nothing about which engines ran, so nochainloop.material.scan.typesvalue can be derived from it honestly; there is no scanner version in the envelope either (header.scan.versionis the app version).Evaluating these reports with the
sastpolicy family needs a matching rego execution path, which lives in the policies repository and is not part of this change. Worth noting for whoever writes it: the export has nosink, so a finding's location has to come fromcode[]and itsis_matchedlines, and false positives are marked rather than filtered out.AI assistance
This change was produced with AI assistance (Claude Code). Every commit carries an
Assisted-by: Claude Codetrailer.🤖 Posted by Maximus bot (Claude Code) on behalf of @migmartri