Beveiligingsadviezen voor je repository's
Als iemand een zwakke plek vindt in software die jij onderhoudt, los je die eerst op en vertel je het daarna. Een beveiligingsadvies is hoe je het vertelt: een korte, gestructureerde verklaring van wat er getroffen is, hoe ernstig, en welke versie het oplost. Scanners lezen adviezen om iedereen te waarschuwen die van je pakket afhankelijk is.
fremforge bewaart de adviezen van een organisatie onder Beveiliging › Rapporten ›
Beveiligingsadviezen, en via de API op /_app/api/v1/orgs/{org}/security-advisories.
Opstellen in besloten kring
Nieuw advies opent een concept. Een concept noemt:
- de repository waarover het gaat;
- een titel van één regel en een beschrijving: wat de zwakke plek is, wie er last van heeft, de impact, en hoe je het oplost of omzeilt;
- de getroffen pakketten, elk met zijn ecosysteem, pakketnaam, kwetsbare versies en de eerste gerepareerde versie;
- de ernst, als CVSS-vector of als niveau (kritiek, hoog, gemiddeld, laag);
- de zwakheden (CWE-id’s), optioneel een CVE-id en referenties.
Een concept is alleen zichtbaar voor:
- de eigenaren van de organisatie. De auditors zien alleen dat het bestaat, de repository, de status en de datums, nooit de inhoud;
- de beheerders van de repository waarover het gaat (zie Beheerders van repository’s);
- de mensen die zij ervoor uitnodigen (zie Medewerkers).
De titel, beschrijving, referenties en reacties worden versleuteld opgeslagen. De eigen operationele tools en AI-agents van fremforge zien noch de tekst, noch wie hem heeft geschreven.
De mensen die een concept kunnen zien, kunnen het bespreken in vertrouwelijke reacties. Die blijven privé, ook nadat het advies is gepubliceerd.
Kwetsbare versies
Schrijf de kwetsbare versies als één of twee voorwaarden, in dezelfde vorm als GitHub:
| Je schrijft | Betekent |
|---|---|
< 1.2.3 | elke versie vóór 1.2.3 |
>= 1.0.0, < 1.2.3 | vanaf 1.0.0 tot, maar niet inclusief, 1.2.3 |
<= 2.0.1 | elke versie tot en met 2.0.1 |
= 3.1.0 | alleen 3.1.0 |
> wordt geweigerd: het OSV-formaat kent geen exclusieve ondergrens, dus gebruik
>=. Met < X is de eerste gerepareerde versie X. Laat Gerepareerde versie
leeg, of gebruik <= voor de laatste getroffen versie.
Ecosystemen: npm, PyPI, Maven (groupId:artifactId), Go (het modulepad),
crates.io, RubyGems, NuGet, Packagist, Pub, Hex, GitHub Actions
(owner/repository), SwiftURL en CRAN.
Ernst
Een basisvector in CVSS 3.1 bepaalt de ernst uit de basisscore, die fremforge berekent. Een basisvector in CVSS 4.0 wordt gecontroleerd en bewaard zoals opgegeven. Kies de ernst dan zelf: de CVSS 4.0-score wordt niet berekend.
Publiceren
Advies publiceren vereist een ernst en ten minste één getroffen pakket.
- Voor een openbare repository (niet privé, in een organisatie met openbare
zichtbaarheid) wordt het advies direct openbaar: een pagina op
https://frem.sh/_app/advisories/<id>en een OSV-record (zie hieronder). Bij elke openbare leesactie wordt opnieuw gecontroleerd of de repository openbaar is. Als je de repository later privé maakt, worden de adviezen ervan bij de volgende leesactie niet meer geserveerd. - Voor een privérepository blijft het advies alleen zichtbaar binnen je organisatie. Het wordt niet openbaar als je de repository later openbaar maakt; publiceer dan een nieuw advies.
Breng de fix uit voordat je publiceert: het advies vertelt iedereen waar de zwakke plek zit.
De fix ontwikkel je voorlopig buiten fremforge. Een advies bevat tekst; fremforge heeft er geen tijdelijke privéfork voor. Een privérepository in je organisatie zou leesbaar zijn voor elk team met toegang tot alle repository’s, en daar horen standaard Members en Viewers bij, dus die wordt niet aangeboden. Ontwikkel de fix zoals je project met ongepubliceerde beveiligingsfixes omgaat, en publiceer het advies zodra de gerepareerde versie is uitgebracht.
Elk advies heeft een id in de vorm FFSA-xxxx-xxxx-xxxx, dat vastligt zodra het
concept wordt aangemaakt.
Beheerders van repository’s
De beheerders van een repository behandelen de adviezen en privémeldingen van
die repository zonder eigenaar van de organisatie te zijn, zoals GitHub
beheerders van repository’s dat laat doen. Ze vinden de meldingen aan de
repository’s die ze beheren onder Meldingen aan repository’s die je beheert
op /_app/security-reports, kunnen ze
accepteren of afwijzen, en kunnen de concepten van die repository’s lezen en
erop reageren. Bij elk verzoek wordt aan frem.sh gevraagd of iemand een
repository beheert, dus een wijziging van rechten geldt direct. Een eigenaar van
de organisatie telt als beheerder van elke repository in de organisatie.
Medewerkers
Nodig mensen uit voor een concept of een gepubliceerd advies met hun frem.sh-login,
bijvoorbeeld een externe onderzoeker of een maintainer van een ander project. Ze
hoeven geen lid van je organisatie te zijn. Een uitgenodigde persoon leest het
advies en de vertrouwelijke reacties, en voegt reacties toe, vanaf de eigen pagina
op /_app/security-reports. Wijzigen of
publiceren kan die persoon niet. Als je iemand verwijdert, eindigt de toegang
direct. Er kunnen tot 20 mensen voor één advies worden uitgenodigd.
Privémeldingen van kwetsbaarheden
Met privémeldingen van kwetsbaarheden aan kan iedereen die bij frem.sh is ingelogd en een repository kan lezen, een zwakke plek daarin privé aan je melden, ook mensen buiten je organisatie. Zonder deze functie moet een vinder een e-mailadres raden of een openbaar issue openen.
Het staat uit tot je het aanzet. Eigenaren stellen een standaard voor de hele organisatie in onder Beveiliging › Rapporten › Beveiligingsadviezen › Instellingen, en kunnen het daar voor afzonderlijke repository’s aan- of uitzetten; een instelling voor een repository gaat voor de standaard.
Wat een melder stuurt
Het meldformulier staat op
https://frem.sh/_app/security-reports/new?repo=<org>/<repository>. Link ernaar
vanuit de SECURITY.md van je repository. Een melding heeft een titel, een
beschrijving, de getroffen versies, hoe de zwakke plek is gevonden en optioneel
een proof of concept. Ze wordt versleuteld opgeslagen, en alleen de eigenaren van
de organisatie, de beheerders van de repository en de melder zien haar. De tekst
staat nooit in een e-mail of in het auditlog; het auditlog noemt meldingen bij
hun id.
Om het kanaal bruikbaar te houden, beperkt fremforge het aantal meldingen:
- 3 per persoon voor één repository, en 10 per persoon in totaal, binnen 24 uur;
- geen enkele van een account dat jonger is dan 24 uur;
- 5 per minuut vanaf één IP-adres.
Een verzoek dat een limiet zou overschrijden, wordt geweigerd en er wordt niets opgeslagen.
Een melding beoordelen
De eigenaren van de organisatie krijgen een e-mail als er een melding binnenkomt,
en vinden haar onder Beveiliging › Rapporten › Beveiligingsadviezen ›
Privémeldingen. De beheerders van de repository vinden haar op hun eigen pagina
op /_app/security-reports.
- Melding accepteren maakt van de melding een conceptadvies, nodigt de melder ervoor uit als medewerker, en vraagt de melder een vermelding als Melder te accepteren.
- Niet accepteren sluit de melding met een reden: geen kwetsbaarheid, duplicaat, buiten de scope, spam of anders.
In beide gevallen krijgt de melder een e-mail. Een melder kan een melding intrekken zolang er nog niet over is beslist. Een afgewezen melding wordt 2 jaar na de afwijzing verwijderd. Geaccepteerde meldingen en hun adviezen blijven bij je organisatie.
Scanning van afhankelijkheden
Een gepubliceerd advies wordt elke dag, en direct nadat je het publiceert,
vergeleken met de inventaris van afhankelijkheden van je organisatie: een
repository die afhankelijk is van een getroffen versie krijgt een bevinding onder
Beveiliging › Bevindingen › Afhankelijkheden, met het FFSA-id van het advies,
net als elke andere kwetsbaarheid. Als je het advies intrekt, verdwijnen de
bevindingen die het heeft veroorzaakt.
Voor andere organisaties wordt een advies alleen vergeleken als het in de platformfeed van fremforge staat. Daarvoor moet, elke dag opnieuw gecontroleerd:
- de repository openbaar zijn; en
- je organisatie aantoonbaar eigenaar zijn van elk getroffen pakket: een pakket
van je organisatie in de frem.sh-pakketregistry, of een
Go-module onder
frem.sh/<your organisation>/; of anders heeft fremforge het advies gereviewd en goedgekeurd.
Het eigenaarschap komt uit de eigen gegevens van frem.sh, nooit uit de pakketnaam:
een npm-scope of een modulepad dat alleen maar op de naam van je organisatie lijkt,
telt niet. Als je het pakket kwijtraakt of de repository privé maakt, verdwijnt het
advies bij de volgende dagelijkse run uit de platformfeed. De platformfeed wordt
geserveerd op /_app/api/v1/advisories?scope=platform, en fremforge voegt hem toe
aan de OSV-databases die zijn scanners lezen.
Intrekken, sluiten, verwijderen
- Een gepubliceerd advies wordt ingetrokken, nooit verwijderd. Het blijft
in de feed staan met
withdrawningesteld, zodat scanners weten dat het niet meer geldt. - Een concept dat je niet publiceert, kan worden gesloten (en heropend) of samen met de reacties worden verwijderd.
Vermeldingen
Vermeld de mensen die de zwakke plek hebben gevonden, gemeld of opgelost, met hun
frem.sh-login en een OSV-type vermelding.
Een vermelding wordt pas openbaar getoond en geëxporteerd als de vermelde persoon
haar heeft geaccepteerd, op de eigen pagina op
/_app/security-reports. Een vermelding
van jezelf hoeft niet te worden geaccepteerd.
Export: OSV en CSAF
Elk advies, ook een concept, kan worden gedownload als:
- OSV 1.6: het formaat dat scanners van afhankelijkheden lezen (osv-scanner, Trivy en de eigen scanning van afhankelijkheden van fremforge);
- CSAF 2.0: een document
csaf_security_advisory, het machineleesbare adviesformaat dat richtsnoeren onder de EU Cyber Resilience Act en het BSI van fabrikanten verwachten. Een concept is TLP AMBER met statusdraft, een gepubliceerd advies TLP WHITE met statusfinal.
Elke download wordt vastgelegd in het auditlog
(security.advisory.exported), omdat de export van een concept een zwakke plek
beschrijft die nog niet is opgelost.
De openbare OSV-feed
Gepubliceerde adviezen van openbare repository’s worden zonder authenticatie geserveerd, oudste wijziging eerst, hoogstens 100 per pagina:
# The first page
curl -s 'https://frem.sh/_app/api/v1/advisories?limit=100'
# The next page: pass the `next` value of the previous answer as `since`
curl -s 'https://frem.sh/_app/api/v1/advisories?since=2026-10-25T00:00:00Z'
# One advisory
curl -s https://frem.sh/_app/api/v1/advisories/FFSA-xxxx-xxxx-xxxxElk record volgt het OSV-schema, met het
CVE-id (als dat er is) als alias en database_specific.source ingesteld op
fremforge. Bij elk verzoek wordt gecontroleerd of de repository openbaar is, dus
een advies van een repository die privé is gemaakt, wordt bij de volgende
leesactie niet meer geserveerd. De openbare leesacties zijn beperkt tot 60
verzoeken per minuut per clientadres (429 daarboven).
Een CVE-id aanvragen
fremforge is geen CVE Numbering Authority en vraagt geen CVE-id’s voor je aan.
Onder Een CVE-id aanvragen geeft een advies je de inhoud als tekst voor het
CVE-aanvraagformulier van MITRE, of voor de CNA die
je project dekt als die er is. Verstuur het zelf en vul daarna het CVE-id dat je
ontvangt in het advies in. De API heeft dezelfde tekst op
/orgs/{org}/security-advisories/{id}/cve-request.
De EU Cyber Resilience Act
De CRA verwacht van een fabrikant dat hij kwetsbaarheden in zijn producten afhandelt: ze oplossen, en informatie publiceren over de opgeloste. Adviezen met CSAF-export ondersteunen dat. Ze maken je niet uit zichzelf compliant, en fremforge meldt niets aan ENISA of een nationaal CSIRT namens je. Melden onder artikel 14 van de CRA blijft jouw taak.
Nog niet beschikbaar
- Een tijdelijke privéfork om de fix in te ontwikkelen: wordt niet aangeboden, zie Publiceren.
API
| Methode en pad | Scope | Doet |
|---|---|---|
GET /orgs/{org}/security-advisories | findings:read / advisories:read | lijst (?state=, ?repo=) |
POST /orgs/{org}/security-advisories | policy:write | een concept aanmaken |
GET, PUT, DELETE /orgs/{org}/security-advisories/{id} | findings:read of advisories:read / policy:write | een concept of gesloten advies lezen, vervangen, verwijderen |
POST .../{id}/publish, /close, /reopen, /withdraw | policy:write | de status wijzigen |
GET .../{id}/osv, /csaf, /cve-request | findings:read of advisories:read | exporteren |
POST .../{id}/credits, DELETE .../{id}/credits/{credit} | policy:write | vermeldingen |
GET, POST .../{id}/comments | advisories:read / policy:write | vertrouwelijke reacties |
findings:read leest alleen gepubliceerde adviezen van openbare repository’s,
met alleen geaccepteerde vermeldingen. Concepten, gesloten adviezen, adviezen van
privérepository’s en de reacties bij elk advies vereisen advisories:read, dat
niet in findings:read zit en dat tokens die voor CI-jobs worden aangemaakt
standaard niet hebben. Een vermelding noemt een frem.sh-gebruiker: een onbekende
login wordt geweigerd.
De volledige schema’s staan in de API-referentie.