Naar de hoofdinhoud

Malwarescan

fremforge zet een scanner op basis van ClamAV vóór de uploadkanalen die onder Kanalen staan. Komt een signatuur overeen, dan wordt de upload geweigerd met HTTP 422 en komt er een bevinding in de malwarescanlog van de tenant.

De scanner draait zonder Cisco Talos en zonder abuse.ch. Beide zetten commercieel gebruik achter een betaalde licentie, en we willen geen subverwerker in het scanpad die we niet volledig kunnen verantwoorden.

Signaturen

FeedWat hij dektFrequentieLicentie
SaneSecurityGangbare e-mail- en macromalware, phishing, JS-droppersElke 4 uur opgehaald van een EU-mirrorGratis, gefinancierd met donaties
YARA-Forge CoreTTP’s van dreigingsactoren, packers, webshells, native payloads. Bundelt meer dan 45 gecontroleerde repository’s met YARA-regels (signature-base van Florian Roth, DidierStevens, enz.)Elke 4 uur opgehaald, upstream wekelijkse releasesDRL 1.1, commercieel gebruik toegestaan met naamsvermelding
Linux Malware Detect (LMD)Payloads aan de serverkant op Linux: webshells, cryptominers, backdoors. Statische dataset van rfxn.comElke 4 uur opgehaald, upstream dagelijksGPLv2
EICAR-testsignatuurDe standaardsignatuur voor een rooktest van een malwarescan, bij elke verversing opnieuw geladenStatisch, gemount uit een ConfigMapPubliek domein

De actualiteit van de feeds wordt bewaakt door de beheerders van fremverk; klanten zien de actualiteit van de signaturen niet direct. De SLA dekt de beschikbaarheid van de scanner.

Naamsvermelding. YARA-Forge Core wordt door YARA-Forge samengesteld uit openbare repository’s met YARA-regels, en elke regel vermeldt zijn auteurs in zijn metadata. Hij wordt gebruikt onder de Detection Rule License 1.1. De signaturen van Linux Malware Detect zijn van R-fx Networks. Zie kennisgevingen van derden.

Kanalen

Gescand, fail-closed (de upload wordt geweigerd als de scanner onbereikbaar is):

  • PUT van LFS-objecten
  • POST van bijlagen bij issues en PR’s
  • PUT / POST naar de pakketregistry, voor elk pakkettype (npm, Maven, PyPI, NuGet, Cargo, containerlagen en de rest), inclusief publicaties vanuit jobs op door fremforge gehoste runners naar de registry van een organisatie

Een upload groter dan 4 GiB kan niet volledig worden gescand en wordt geweigerd met HTTP 413.

Alleen gescand als je organisatie het aanzet (standaard uit):

NIET gescand:

  • Pushes via het Git-protocol (Git-objecten). Detectie van secrets bij het pushen wordt apart afgehandeld door push-bescherming.
  • Workflowartefacten. Die leven kort, zijn beperkt tot de tenant, en het beleid zegt al “accepteer geen artefacten die je niet vertrouwt”. Modelbestanden daartussen worden gecontroleerd door modelscanning, alleen als bevindingen.

Ophalen via de dependency proxy

Wat de dependency proxy ophaalt uit een upstream registry (pakketbestanden van npm, PyPI, Maven, NuGet, Go, Cargo, Helm en RPM, en lagen van containerimages) wordt standaard niet met ClamAV gescand. Dat is hetzelfde als bij GitHub en GitLab, die pakketdownloads ook niet op virussen scannen: openbare registries onderscheppen malware wanneer een pakket wordt gepubliceerd en publiceren het als malware-advisory.

Wat voor elke organisatie blijft gelden, of ClamAV-scans nu aan of uit staan:

  • Bekende kwaadaardige pakketten. Elke pakketversie die de proxy serveert, wordt onder je pakketbeleid vergeleken met de MAL--malware-advisories van OSV. Een overeenkomst wordt voor elke organisatie geweigerd, ongeacht de modus van het beleid (sinds 2026-10-11; voor de eigen interne organisaties van fremforge sinds 2026-10-10): de download antwoordt 403 met de reden, en de versie wordt weggelaten uit de pakketmetadata die de proxy serveert, zodat pakketbeheerders uitkomen op een versie die niet kwaadaardig is. Zie Kwaadaardige pakketten.
  • Inhoud die ClamAV al als geïnfecteerd heeft gevonden, blijft geblokkeerd. Een bestand of image-laag die een scan als geïnfecteerd heeft gevonden, wordt aan elke organisatie geweigerd, of die organisatie nu scant of niet.
  • Uploads en gepushte images worden altijd gescand, zoals vermeld onder Kanalen.

Wil je dat de proxy wat hij ophaalt met ClamAV scant, zet dan Proxy-virusscan: opgehaalde pakketten en images scannen (ClamAV) aan onder Organisatiebeheer → Bouwen en uitrollen → Proxy voor afhankelijkheden, of stel malware_scan: true in met PUT /orgs/{org}/dependency-proxy. Staat het aan, dan wordt elk pakketbestand en elke image-laag die de proxy voor je organisatie ophaalt door ClamAV gestreamd, en wordt wat hij geïnfecteerd vindt of niet volledig kan scannen, tegengehouden. Dat geldt ook voor een bestand groter dan 4 GiB, behalve een modellaag in safetensors of GGUF die haar formaatcontrole doorstaat. Een scan van een image-laag waarvoor de tijd opraakt, is geen oordeel: de laag wordt tegengehouden en in de wachtrij gezet voor de achtergrondscanner voor lagen van fremforge, en een latere pull wordt geleverd zodra die scan slaagt. Een pakketbestand waarvoor de scantijd opraakt, wordt op dezelfde manier behandeld: het wordt voor dat verzoek tegengehouden, op de achtergrond gescand en bij een later verzoek geleverd zodra die scan slaagt. Een RPM wordt intussen, zoals alle RPM-inhoud, alleen in de eigen ruimte van je organisatie opgeslagen en gescand. Een bestand dat de proxy zonder scan voor een andere organisatie in de cache heeft gezet, wordt opnieuw opgehaald en gescand voordat het aan jouw organisatie wordt geleverd.

Nieuwe images tegenhouden tot de malwarescan klaar is (block_until_scanned) wacht op die scan en heeft dus ClamAV-scans nodig. Een verzoek waardoor block_until_scanned aan zou blijven met malware_scan uit, wordt geweigerd met 400 scan-pair.

Wat er gebeurt als een signatuur overeenkomt

  1. De proxy weigert de upload met HTTP 422 en een body die de signatuur noemt, de SHA-256 van de geweigerde bytes en een verwijzing naar de procedure voor een uitzondering.
  2. Er wordt een bevinding naar malware_scan_findings geschreven via het endpoint /internal/malware-scan/ingest van de API (wederzijdse authenticatie, bearer + IP-allowlist).
  3. De bevinding verschijnt direct in het tenantbeheer onder Beveiliging, Malwarescan, met het uploadpad, de overeenkomende signatuur, wie de upload probeerde en de bestandsgrootte.

Uitzonderingen (fout-positieven)

Sommige signaturen slaan aan op legitieme testfixtures, samples voor beveiligingsonderzoek of onschuldige artefacten die toevallig overeenkomen met een oud patroon. Tenantbeheerders kunnen een uitzondering toevoegen die een specifieke combinatie van SHA-256-hash en repository toestaat.

  1. Tenantbeheer → Beveiliging › Bevindingen › Malware. Klap Actieve uitzonderingen uit en klik op Uitzondering toevoegen.
  2. Plak de SHA-256 van het geweigerde bestand (die staat in het 422-antwoord).
  3. Kies het bereik: alleen deze repository, of alle repository’s in de organisatie.
  4. Stel een vervaldatum in (standaard 90 dagen; maximaal 1 jaar).
  5. Voeg een onderbouwing toe (vrije tekst, vastgelegd in de auditlog van de organisatie).

Een uitzondering slaat alleen de beslissing op basis van de hash over. Komt een andere signatuur overeen met dezelfde bytes, dan wordt de upload nog steeds geweigerd. De beheerders van fremverk beoordelen uitzonderingen elk kwartaal als onderdeel van de beveiligingsreview.

Via de REST API

Bevindingen en uitzonderingen van de malwarescan zijn beschikbaar in de openbare API. Gebruik dit om meldingen over geweigerde uploads aan een extern ticketsysteem te koppelen, de levenscyclus van uitzonderingen te scripten of het geheel vanuit een AI-agent aan te sturen.

  • Bevindingen opvragen GET /_app/api/v1/orgs/:slug/malware-scan/findings
  • Een bevinding negeren POST /_app/api/v1/orgs/:slug/malware-scan/findings/:id/dismiss
  • Uitzonderingen opvragen GET /_app/api/v1/orgs/:slug/malware-scan/overrides
  • Uitzondering aanmaken POST /_app/api/v1/orgs/:slug/malware-scan/overrides body: { "kind": "file", "signature": "sha256:...", "reason": "test fixture", "expires_at": "2027-01-01T00:00:00Z" }
  • Uitzondering intrekken DELETE /_app/api/v1/orgs/:slug/malware-scan/overrides/:id

Voor het opvragen is de scope findings:read nodig en voor het negeren van een bevinding findings:write. Voor het aanmaken of intrekken van een uitzondering is policy:write nodig, omdat een uitzondering uploads van de scan vrijstelt; het runnertoken van een CI-job heeft die scope nooit. Gebruik een Personal Access Token (PAT):

curl -X POST \
  -H "Authorization: Bearer ${FREMFORGE_PAT}" \
  -H "Content-Type: application/json" \
  -d '{"kind":"file","signature":"sha256:abc123...","reason":"known-clean test artefact","expires_at":"2027-01-01T00:00:00Z"}' \
  https://frem.sh/_app/api/v1/orgs/acme/malware-scan/overrides

Zie de referentie van de openbare REST API voor de volledige OpenAPI-specificatie.

SLA en fail-closed

Is de ClamAV-daemon onbereikbaar, dan worden uploads geweigerd met HTTP 503 en een Retry-After. Dat is de fail-closed-keuze volgens onze Acceptable Use Policy. Het alternatief (fail-open tijdens een storing van de scanner) opent een venster waarin de toezegging uit de AUP ongemerkt wordt omzeild; die afweging vinden we het niet waard. Beheerders worden binnen 5 minuten opgeroepen als de scanner uitvalt.

EICAR-rooktest

Een canary-CronJob uploadt elke 30 minuten het standaard EICAR-testbestand en controleert of de upload wordt geweigerd. Slagen drie opeenvolgende canary-runs (dat wil zeggen: de weigering blijft uit), dan worden de beheerders opgeroepen. Dat dekt het geval waarin de signatuurdatabase schoon werd uitgeleverd maar niet kon worden geladen.