免費、開源的 GitHub Action:CycloneDX SBOM、主動偵測被利用的弱點(CISA KEV),以及 EU CRA 第14條報告時鐘,附預先填寫的草稿。
AI 翻譯
A free, open source GitHub Action: CycloneDX SBOM, actively exploited vulnerability detection (CISA KEV), and the EU CRA Article 14 reporting clock with pre-filled drafts.
外掛JavaScript · HTMLGitHub @GautamTalksDev上線中營運者未確認
試用過了嗎? 點一下就好,不需要登入。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證24 hours starts the moment you know. The EU Cyber Resilience Act Article 14 reporting clock as a GitHub Action: SBOM, actively exploited vulnerability detection (CISA KEV), ENISA drafts.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
24 hours starts the moment you know.
The EU Cyber Resilience Act reporting clock, as a GitHub Action. CRA Clock reads your lockfiles, writes a CycloneDX
SBOM, checks every component against OSV, CISA's Known Exploited Vulnerabilities catalog and FIRST EPSS, and the moment
something you ship is actively exploited it opens an issue with the Article 14 deadlines and pre-filled ENISA drafts.
The scanner on craclock.gautamkhosla.com , run on its built-in demo project (a Java service still shipping Log4Shell). The Action applies the same tiers to your lockfiles on every push.檢視完整 README ↗The EU Cyber Resilience Act reporting clock, as a GitHub Action. CRA Clock reads your lockfiles, writes a CycloneDX SBOM, checks every component against OSV, CISA's Known Exploited Vulnerabilities catalog and FIRST EPSS, and the moment something you ship is actively exploited it opens an issue with the Article 14 deadlines and pre-filled ENISA drafts.
Website · Install · What it does · Outputs · Security · CRA primer
The scanner on craclock.gautamkhosla.com, run on its built-in demo project (a Java service still shipping Log4Shell). The Action applies the same tiers to your lockfiles on every push.
Add these steps to a job (the full workflow, with the schedule, permissions and artifact upload, is under Install):
- uses: actions/checkout@v5
- uses: GautamTalksDev/cra-clock@v1
with: { product-name: Acme Router }
No repository to wire up yet? Scan a lockfile in your browser: nothing is installed and the lockfile never leaves your browser.
From 11 September 2026, Article 14 of the EU Cyber Resilience Act requires manufacturers of products with digital elements made available in the EU to report actively exploited vulnerabilities (and severe incidents) through the single reporting platform set up under the CRA. For an actively exploited vulnerability:
| When | What |
|---|---|
| 24 hours after becoming aware | Early warning: exploited, which product, which Member States |
| 72 hours | Notification: nature of the exploit and the vulnerability, corrective and mitigating measures |
| 14 days after a corrective or mitigating measure is available | Final report |
This applies to products already on the market; the rest of the CRA (including the SBOM obligation) applies from 11 December 2027. Large vendors have PSIRTs. Smaller teams without anyone watching their dependencies can learn about an exploited component late, for example from a customer report, while the 24 hours may already be running from the moment they could have known. CRA Clock covers actively exploited vulnerabilities in your dependencies; severe incidents are outside its scope.
Primary sources: Regulation (EU) 2024/2847 on EUR-Lex (Article 14, reporting; Article 71, dates of application) and the European Commission's CRA reporting obligations page.
CRA Clock is on the GitHub Marketplace. Reference the Action by repository as shown below.
# .github/workflows/cra-clock.yml
name: cra-clock
on:
push: { branches: [main] }
schedule: [{ cron: '17 */6 * * *' }] # KEV changes daily; check every 6 hours
permissions: { contents: read, issues: write }
jobs:
clock:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with: { persist-credentials: false }
- uses: GautamTalksDev/cra-clock@v1
with:
product-name: Acme Router
open-issues: ${{ github.event_name != 'pull_request' }}
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }} # keep the SBOM and VEX when the clock fails the job
with: { name: cra-clock, path: cra-clock/ }
Pin by commit SHA (recommended). Tags can move; a full commit SHA cannot. Pin a release's SHA and let Dependabot update it:
- uses: GautamTalksDev/cra-clock@<full-40-character-commit-sha> # v1.0.0
Pull requests from forks. GitHub gives fork pull requests a read-only token, so issues cannot be opened. If issue
creation returns 403, CRA Clock falls back to the job summary with a note instead of failing. Set open-issues: false
for pull_request events (as above) and let the push and schedule runs open the issues.
flowchart LR
R[Your repo<br/>12 lockfile formats] --> S[CycloneDX 1.6 SBOM]
S --> O[OSV.dev<br/>affected versions]
O --> K{CISA KEV?}
O --> E[FIRST EPSS<br/>exploit probability]
K -- yes --> X[EXPLOITED<br/>Article 14 clock starts]
E -- ">= threshold" --> L[LIKELY<br/>warning]
K -- no --> N[known advisory]
X --> I[Issue: 24h / 72h deadlines,<br/>fix version, ENISA drafts]
X --> V[CycloneDX VEX<br/>in_triage + evidence]
package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, requirements.txt (pinned),
poetry.lock, Pipfile.lock, go.mod, Cargo.lock, Gemfile.lock, composer.lock, gradle.lockfile.intel-incomplete, listed in the job summary for manual review, and the job fails unless allow-incomplete-intel: true.
If the CISA KEV catalog cannot be read, or comes back empty, the report says "Could not confirm exploitation status"
(never "no actively exploited vulnerabilities") and the job exits 2.| File | What |
|---|---|
cra-clock/sbom.cdx.json | CycloneDX 1.6 SBOM with purls and the files each component came from |
cra-clock/vex.cdx.json | CycloneDX 1.6 VEX: each vulnerability, affected components, KEV and EPSS evidence |
cra-clock/report.md | The job summary (also written to the GitHub step summary) |
Issues labelled cra-clock | One per actively exploited vulnerability, with deadlines and drafts |
Step outputs: components, exploited, likely, intel-incomplete, kev-status, sbom, vex. When the KEV catalog
cannot be read, exploited is the word unknown (not 0) and kev-status is unknown; otherwise kev-status is ok.
| Input | Default | |
|---|---|---|
product-name | repo name | Used in reports and drafts |
product-version | ref name | Recorded in the SBOM |
open-issues | true | true or false. Open and update Article 14 issues. Use false on pull_request |
fail-on | exploited | exploited, likely, or never. Anything else is an error |
epss-threshold | 0.1 | A number from 0 to 1; EPSS at or above this is "likely". 0 is allowed. Anything else is an error |
allow-incomplete-intel | false | true lets the job pass when some advisories could not be fully checked (they are still listed) |
output-dir | cra-clock | Where files are written |
Exit codes: 0 clean, 1 a fail-on condition or incomplete intelligence, 2 invalid input or an outage
(for example, the CISA KEV catalog could not be downloaded, or came back empty; the SBOM, VEX and a report that says
"Could not confirm exploitation status" are still written).
The website scans a lockfile in your browser with the same parsers and tiers. The lockfile never leaves your browser: only package names and versions are sent to OSV.dev, and only CVE ids to FIRST. Click "Try a vulnerable demo project" to see a Java service still shipping Log4Shell (disclosed December 2021) light up.
node --test test/*.test.mjs # parsers for every format, the clock, untrusted-text handling, KEV outages, end to end
node site/dev.mjs 8792 # the website, with a live KEV mirror
CRA Clock prepares drafts and evidence; it does not submit anything for you. Check whether your product is in scope. CISA KEV is one reliable source of exploitation evidence; if you learn of exploitation another way, the clock started then.
Apache-2.0.