Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
무료 오픈소스 GitHub Action으로 CycloneDX SBOM, 취약점 탐지, EU CRA 제14조 보고 시계 제공
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를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.