Naar de hoofdinhoud

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 schrijftBetekent
< 1.2.3elke versie vóór 1.2.3
>= 1.0.0, < 1.2.3vanaf 1.0.0 tot, maar niet inclusief, 1.2.3
<= 2.0.1elke versie tot en met 2.0.1
= 3.1.0alleen 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 withdrawn ingesteld, 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 status draft, een gepubliceerd advies TLP WHITE met status final.

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-xxxx

Elk 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 padScopeDoet
GET /orgs/{org}/security-advisoriesfindings:read / advisories:readlijst (?state=, ?repo=)
POST /orgs/{org}/security-advisoriespolicy:writeeen concept aanmaken
GET, PUT, DELETE /orgs/{org}/security-advisories/{id}findings:read of advisories:read / policy:writeeen concept of gesloten advies lezen, vervangen, verwijderen
POST .../{id}/publish, /close, /reopen, /withdrawpolicy:writede status wijzigen
GET .../{id}/osv, /csaf, /cve-requestfindings:read of advisories:readexporteren
POST .../{id}/credits, DELETE .../{id}/credits/{credit}policy:writevermeldingen
GET, POST .../{id}/commentsadvisories:read / policy:writevertrouwelijke 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.