Skip to main content
Blog
Blog

AppsFlyer Web SDK supply-chain compromittering - polymorfe crypto-stealer

Een DNS-kaping op registrar-niveau van appsflyer.com diende een polymorfe crypto-stelende payload via de AppsFlyer Web SDK, waardoor duizenden sites en sommige Node.js-serveromgevingen werden getroffen. Dit artikel vat telemetrie, forensische indicatoren, IOC's, detectierichtlijnen en herstelstappen samen.

Mar 18, 2026 9 min read
AppsFlyer Web SDK supply-chain compromittering - polymorfe crypto-stealer omslagafbeelding
Inhoudsopgave

Kort samengevat: AppsFlyer-SDK v0.0.60 stille downgrade DNS-hijack

  • Registrar-kaping, echt domein: AppsFlyers servers werden nooit geraakt. De aanvallers pakten het registrar-account, draaiden de nameservers om en serveerden een gedowngrade SDK vanaf het echte domein. Perimetertools bewaakten de verkeerde perimeter.
  • Stille versie-downgrade: De gecompromitteerde SDK zakte stil van v0.0.60 (hash 7dbae31c) terug naar v0.0.59 (hash db0c4f61), verving window.fetch en scande de DOM naar walletadressen in zowel browser- als Node.js-varianten. cside logde de wisselende hashes al dagen voordat het incident publiek werd.
  • Vergelijk nu de hashes: Consumeer je een vendor-SDK via een CDN-URL, vergelijk dan vandaag nog de geserveerde versies en hashes met een bekende goede baseline. Kun je SRI niet afdwingen (dynamische SDK's staan dat niet toe), voeg dan runtime-detectie van API-overrides en DOM-mutaties toe voordat de volgende stille downgrade landt.

Weinig tijd? Bekijk cside's in-browser Magecart- en skimmerblokkering. Dit dekt alles hieronder in één deployment.

Een kwaadwillende actor compromitteerde de domeininfrastructuur die de AppsFlyer Web SDK diende en injecteerde een polymorfe crypto-stelende payload in duizenden websites. De aanvallers kaapten DNS op registrar-niveau, waardoor standaard beveiligingsmaatregelen werden omzeild en ze kwaadaardige code konden serveren vanaf wat leek op legitieme AppsFlyer-eindpunten. Het geïnjecteerde script verving de native window.fetch-API, monitorde de DOM op cryptocurrency-adressen en stuurde slachtofferdata naar door de aanvaller beheerde command-and-control-servers. Ook Node.js-serveromgevingen werden aangevallen, waardoor SSR-frameworks en build-pipelines risico liepen.

Wat de telemetrie van cside laat zien

Voordat het incident algemeen bekend was, registreerde de Script Insights-telemetrie van cside ongewoon gedrag van de AppsFlyer Web SDK. Vanaf 1 maart observeerde cside dat twee verschillende scripthashes werden geserveerd vanaf het officiële AppsFlyer-eindpunt binnen het gemonitorde netwerk. Deze rotatie begon voordat het incident werd bevestigd, wat suggereert dat de aanvallers hun deploymentinfrastructuur testten of bewust polymorfe builds serveerden om detectie te vermijden.

De telemetrie van cside bevestigde dat grote platforms de gecompromitteerde SDK laadden. Specifieke domeinen worden achtergehouden terwijl getroffen organisaties het herstel voltooien. Voor de voorschrijvende maatregelen die dit soort incidenten indammen, zie onze best practices voor het beveiligen van externe scripts tegen supply-chain-compromittering.

De aanvalsvector: een DNS-kaping op registrar-niveau

De aanvallers hebben de AWS-infrastructuur of interne repositories van AppsFlyer niet doorbroken. Ze verkregen toegang via een DNS-kaping op registrar-niveau.

Door het domeinregistrar-account voor appsflyer.com te compromitteren, wijzigden de aanvallers de autoritatieve nameservers. DNS-records tonen dat aan het begin van de aanval de nameservers voor appsflyer.com veranderden van AWS Route 53 naar ns1.gcorelabs.net (GCore CDN).

Eenmaal in controle van DNS routeerden de aanvallers al het verkeer voor websdk.appsflyer.com via hun eigen servers. Ze onderschepten verzoeken voor de legitieme SDK en leverden een kwaadaardige, verlaagde payload. Omdat de compromittering plaatsvond op de DNS-laag, omzeilde deze methode standaard perimeterbeveiliging en server-side bescherming.

De voornaamste forensische indicator: een stille versieverlaging

Omdat de aanvallers DNS beheersten, hoefden ze de kernlogica van de AppsFlyer SDK niet te wijzigen, ze gebruikten die alleen om hun payload te leveren.

Het duidelijkste teken van manipulatie was een stille versieverlaging. De baseline-SDK vóór het incident was versie 0.0.60 (hash 7dbae31c...). Tijdens de aanval werd de versie die vanaf het officiële eindpunt werd geserveerd teruggedraaid naar 0.0.59 (hash db0c4f61...). Legitieme updates draaien versienummers niet terug, wat dit tot duidelijk bewijs van manipulatie maakt.

cside vergeleek de schone en verlaagde SDK's en identificeerde drie gewijzigde regels. De aanvallers verwijderden specifieke banner-eindpunten en wijzigden de interne versiestring.

// Schone SDK (0.0.60)
VERSION:"0.0.60"
banner.appsflyer.com/
banner.appsflyer.com/sb/
dismissInjectPixel // aanwezig in schone build

// Gecompromitteerde SDK (0.0.59)
VERSION:"0.0.59"
banner.appsflyer.com/ // .sb/-eindpunt verwijderd
// dismissInjectPixel-functie verwijderd

De aanvallers vermeden het wijzigen van fvalid.appsflyer[.]com of wa.appsflyer[.]com/events, wat Subresource Integrity-controles zou hebben verbroken. In plaats daarvan gebruikten ze de DNS-kaping om al het appsflyer.com-verkeer via hun infrastructuur te routeren, waar de kwaadaardige payloads werden geserveerd.

Na de aanval verplaatste AppsFlyer zijn infrastructuur naar appsflyersdk[.]com en bracht een schone 0.0.61-build uit op dat domein. Het domein appsflyersdk[.]com, geregistreerd in augustus 2019, is eigendom van AppsFlyer.

Deobfuscatie van de polymorfe payloads

Verkeer dat via de gecompromitteerde servers werd gerouteerd, droeg de crypto-stelende payload. Analyse van drie kwaadaardige bestanden onthulde een polymorfe deploymentaanpak met twee obfuscatieschema's gericht op afzonderlijke uitvoeringsomgevingen.

Buildtype 1: de browserpayload (c7adfa8e)

De eerste payload, ongeveer 170KB groot, draait in de globale window-scope van de browser. Hij gebruikt aangepaste base91-codering met een alfabet van 83 tekens om tijdens runtime een stringtabel van 786 items te decoderen.

In een sandbox vervangt deze payload window.fetch en registreert een MutationObserver om de DOM te scannen op cryptocurrency-adressen. Hij voegt ook een intern module genaamd NetHooksmith toe aan het window-object (window.lIXMkR.NetHooksmith).

Buildtype 2: de Node.js-wrappers (87e46457 & 9b0fac22)

De tweede variant, aangetroffen in twee builds van elk ongeveer 250KB, gebruikt een andere obfuscatietechniek gericht op serveromgevingen. In plaats van base91 sluiten deze bestanden de kernlogica in geneste Function()-constructors in en decoderen ze strings via een roterende constante array gecombineerd met String.fromCodePoint.

Deze wrappers gebruiken getter-objecten om in te haken op Node.js-contexten: bijvoorbeeld get GKSDgsL(){return global} en get F1t0ak(){return exports}. Node.js-applicaties, SSR-frameworks en build-pipelines die de SDK via npm of bundlers importeerden, waren kwetsbaar.

cside onderschepte fromCodePoint-aanroepen tijdens sandbox-uitvoering om de gedecodeerde strings te verkrijgen, wat bevestigde dat de wrappers dezelfde kern-fetch-vervangingslogica uitvoerden, maar aparte walletadressen gebruikten. Dit wijst op toegewijde infrastructuur voor server-side compromittering.

De twee walletclusters en C2-infrastructuur

Sandbox-analyse identificeerde twee afzonderlijke walletclusters van de aanvaller. De browserpayload (buildtype 1) bevatte één set adressen, en de Node.js-payloads (buildtype 2) bevatten een andere. Beide sloegen deze op in een globaal walletAddresses-object.

Cluster 1 (browserpayload c7adfa8e)

  • ETH: 0x1C069d0c73087D0Bae687a6f74a807350dCe1829
  • BTC: bc1qr7ngtnsh66demm4vzt4kmqxkqj8sqprnuklalt
  • SOL: 4LJi6mAczxZWbUvbMEk5scKhUZNPvfMDTjaVADkPFSsK
  • XRP: rntqwheGbZihkabxf6xqZkUKGfTVyRhT14
  • TRX: TV6WtAkS4aAMJb3Rt2bfs8LxggF8Kmqbd9

Cluster 2 (Node.js-wrappers 87e46457 & 9b0fac22)

  • ETH: 0x782B93e52e62F25Bd002eeAA813B5A3fe49C9558
  • BTC: bc1q5nlx0exu0efldavw08wnjzpzluudaqh2qwlmjj
  • SOL: B5hMeV7B72xqcjypzxxoPmLpNz3bi6VvZApQrnh8YwDP
  • XRP: rEL7cB3jQNqtoym8oFJ36w1z3QLy9GjU
  • TRX: T062f95a517fc05055b59e12c6f4b2a402

Command-and-control (C2)-eindpunten

De payloads communiceerden met twee C2-eindpunten op de gekaapte infrastructuur:

  1. https://websdk[.]appsflyer[.]com/v1/api/plugin - haalde bij initialisatie nieuwe walletadressen op.
  2. https://websdk[.]appsflyer[.]com/v1/api/process - uploadde geëxfiltreerde walletadressen en metadata via een ?rd=-queryparameter met XOR-geobfusceerde data.

Gedragssignaturen en detectie

Omdat de aanvallers obfuscatieschema's en walletadressen rouleerden, waren statische signatures zoals YARA-regels ineffectief. Het gedrag van de payloads is echter consistent en kan worden gedetecteerd.

Beveiligingsteams moeten letten op de volgende indicatoren:

  • Console-uitvoer: Alle payloads printen "Generating new wallets..." naar de console tijdens initialisatie.
  • fetch-vervanging: De payload overschrijft de native fetch-API om uitgaande verzoeken met cryptocurrency-adressen te onderscheppen.
  • Vervuiling van globale objecten: De payload maakt een globaal walletAddresses-object aan; de browservariant voegt window.lIXMkR.NetHooksmith toe.
  • Console-onderdrukking: De browserpayload gebruikt 32 verwijzingen naar console-methoden om waarschuwingen en fouten te verbergen.
  • DOM-mutatietracking: De browserpayload registreert een MutationObserver om nieuwe DOM-elementen te scannen op patronen van cryptocurrency-adressen.

Voorbij het incident: het fingerprinting-oppervlak van de legitieme SDK

Onderzoek van de schone SDK (hash 7dbae31c) onthulde dat de legitieme AppsFlyer PBA-plugin uitgebreide apparaat-fingerprintingdata verzamelde, waaronder canvas-fontcontroles, ad-blocker-detectie, botdetectie en toegang tot localStorage, sessionStorage en indexedDB.

De SDK laadt tijdens runtime ook aanvullende code van fvalid.appsflyer[.]com/af/cp.sdk.1.2.7.js. Hoewel dit gebruikelijk is in marketing-SDK's, vormt dit een aanhoudend supply-chain-risico. Organisaties moeten de noodzaak van dergelijke tracking beoordelen en strikte Content Security Policies (CSP) en Subresource Integrity (SRI) toepassen op alle externe code.

Hoe cside had kunnen helpen

Een DNS-kaping op registrar-niveau omzeilt perimeterbeveiliging en statische analyse. De client-side beveiligingsaanpak van cside detecteert en blokkeert dergelijke aanvallen in realtime via de volgende mechanismen:

  • Gedragsafwijkingsdetectie: cside monitort scriptacties in plaats van statische signatures en waarschuwt bij pogingen om window.fetch te overschrijven of toegang te krijgen tot cryptocurrency-invoervelden.
  • Blokkering van netwerkexfiltratie: Als de payload wordt uitgevoerd, kunnen de netwerkcontroles van cside uitgaande verbindingen naar C2-servers blokkeren en zo het ophalen van wallets en gegevensdiefstal stoppen.
  • Waarschuwingen bij hashrotatie: De telemetrie van cside detecteerde afwisselende scripthashes dagen voordat de aanval publiek werd, wat vroegtijdig onderzoek mogelijk maakte.
  • Detectie van versieverlaging: cside registreert exacte versies en hashes van externe scripts. Een stille verlaging van v0.0.60 naar v0.0.59 zou direct een manipulatiewaarschuwing activeren.

Door zero-trust-maatregelen op de client-side toe te passen, voorkomt cside dat gecompromitteerde leveranciersscripts misbruik maken van het vertrouwen van gebruikers.

Indicatoren van compromittering (IOC's)

  • Domein: appsflyer[.]com - Legitiem domein gekaapt op registrar-niveau
  • Nameserver: ns1.gcorelabs.net - Door aanvaller beheerde nameserver tijdens de kaping
  • URL (C2): https://websdk[.]appsflyer[.]com/v1/api/plugin - C2-eindpunt van payload (walletrotatie)
  • URL (C2): https://websdk[.]appsflyer[.]com/v1/api/process - C2-eindpunt van payload (exfiltratie)
  • URL-parameter: ?rd= - Bevat XOR-geobfusceerde exfiltratiedata
  • Wallet (ETH): 0x1C069d0c73087D0Bae687a6f74a807350dCe1829 - Cluster 1 (browserpayload)
  • Wallet (BTC): bc1qr7ngtnsh66demm4vzt4kmqxkqj8sqprnuklalt - Cluster 1 (browserpayload)
  • Wallet (SOL): 4LJi6mAczxZWbUvbMEk5scKhUZNPvfMDTjaVADkPFSsK - Cluster 1 (browserpayload)
  • Wallet (ETH): 0x782B93e52e62F25Bd002eeAA813B5A3fe49C9558 - Cluster 2 (Node.js-wrappers)
  • Console-string: "Generating new wallets..." - Plaintext-uitvoer door alle payloads
  • Globaal object: walletAddresses - Geïnjecteerd door alle payloadvarianten
  • Globaal object: window.lIXMkR.NetHooksmith - Geïnjecteerd door browserpayload
  • Versiestring: 0.0.59 - Verlaagde SDK-versie die op manipulatie wijst

Aanbevelingen

  1. Vergelijk onmiddellijk de SDK-versie en hash die worden geserveerd vanaf de AppsFlyer-eindpunten die u gebruikt met bekende goede hashes; behandel stille verlagingen als manipulatiewaarschuwingen met hoge prioriteit.
  2. Blokkeer of sinkhole uitgaande verzoeken naar de geïdentificeerde C2-eindpunten en bijbehorende nameservers totdat het herstel is voltooid.
  3. Versterk CSP en pas SRI toe op externe resources waar mogelijk; overweeg om kritieke leveranciersscripts zelf te hosten na verificatie van de integriteit.
  4. Scan server-side build-pipelines en SSR-deployments op de hierboven beschreven Node.js-wrapper-indicatoren en roteer eventueel getroffen inloggegevens.
  5. Implementeer cside om te waken voor API-overrides (zoals fetch) en DOM-mutatiescans door externe scripts.

Dit incident staat niet op zichzelf. Voor een diepgaandere blik op hoe infrastructure laundering de dreiging verder uitbreidt dan de compromittering van één enkele leverancier, zie onze analyse van de gesanctioneerde polyfill-infrastructuur. Voor een recenter geval van hetzelfde afleveringsmechanisme dat rechtstreeks op DeFi-gebruikers is gericht, zie de Polymarket-supplychainaanval van $3M aan de clientzijde.

Forensische details, bestandshashes en aanvullende telemetrie zijn op verzoek beschikbaar voor getroffen organisaties en incident responders.

Opmerking: Dit artikel vat bevindingen samen uit de Script Insights-telemetrie en sandbox-analyse van cside. Sommige specifieke domeinen en aanvullende IOC's worden achtergehouden terwijl getroffen partijen herstelmaatregelen treffen.

Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks, web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

De aanvallers compromitteerden het registrar-account voor appsflyer.com en wijzigden de autoritatieve nameservers naar een door de aanvaller beheerde provider, waardoor ze legitiem subdomeinverkeer via hun eigen infrastructuur konden routeren. Omdat de wijziging plaatsvond op DNS-niveau, leverden verzoeken aan het officiële SDK-eindpunt kwaadaardige payloads op zonder dat upstream AWS- of repository-assets werden aangepast, waardoor veel perimeter- en server-side beveiligingsmaatregelen werden omzeild.

Het duidelijkste forensische teken was een stille versieverlaging van v0.0.60 naar v0.0.59, geserveerd vanaf het officiële eindpunt; legitieme releases draaien versienummers niet terug. Vergelijking van schone en gecompromitteerde builds onthulde verwijderde banner-eindpunten en een verwijderde functie, consistent met een verlaagde build die werd gebruikt om kwaadaardige code te hosten.

Let op gedragsindicatoren zoals vervanging van de native window.fetch, het aanmaken van een globaal walletAddresses-object, console-uitvoer met 'Generating new wallets...', en de registratie van een MutationObserver die de DOM scant op patronen van cryptocurrency-adressen. Dit runtimegedrag is consistent over polymorfe builds heen en is betrouwbaarder dan statische signatures.

De aanvallers dienden ook op Node gerichte wrappers die geneste Function()-constructors en String.fromCodePoint-decodering gebruiken, en ze stellen getters beschikbaar die global- en exports-objecten teruggeven (bijvoorbeeld get GKSDgsL(){return global}). Detecteerbare artefacten zijn onder meer ongebruikelijke fromCodePoint-decoderingspatronen, vervangen fetch-logica in servercontexten en dezelfde walletAddresses-objecten met een andere walletcluster.

Vergelijk geserveerde SDK-versies en hashes met vertrouwde basislijnen en behandel stille verlagingen als manipulatie. Blokkeer de geïdentificeerde C2-eindpunten en door de aanvaller beheerde nameservers, roteer eventueel blootgestelde inloggegevens, scan build/CI-pipelines op geïnjecteerde wrappers, en overweeg tijdelijk zelf te hosten of de externe SDK te verwijderen totdat de integriteit is geverifieerd.

Geef prioriteit aan het blokkeren van de gekaapte nameservers (bijvoorbeeld ns1.gcorelabs.net waargenomen tijdens het incident), de C2-eindpunten op het gekaapte websdk-subdomein (de /v1/api/plugin- en /v1/api/process-URL's), en specifieke walletadressen terwijl het onderzoek voortduurt. Stel ook waarschuwingen in voor console-uitvoer 'Generating new wallets...' en het aanmaken van globale objecten zoals walletAddresses.

CSP beperkt de bronnen waaruit scripts mogen worden geladen en kan de uitvoering van off-domain of onverwachte resources voorkomen; SRI stelt browsers in staat de integriteit van scripts te verifiëren aan de hand van bekende hashes. Samen verkleinen deze maatregelen de impact van DNS- of CDN-compromitteringen door het voor aanvallers moeilijker te maken ongeautoriseerde code bij clients uit te voeren.

De aanvallers gebruikten polymorfisme en wisselden obfuscatieschema's en walletclusters af om statische signatures te omzeilen, maar hun kwaadaardige gedrag, het overschrijven van fetch, het scannen van de DOM op crypto-adressen, het aanmaken van walletopslag en het contact opnemen met C2-eindpunten, bleef consistent. Gedragsdetectie identificeert deze runtimeacties en kan exfiltratie blokkeren ongeacht obfuscatie op stringniveau.

Monitor en beveilig je third-party scripts

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Start gratis, of probeer Business met een proefperiode van 14 dagen.

cside-dashboardinterface met scriptmonitoring en beveiligingsanalyses
Related Articles
Boek een demo

Wil je dit doornemen met een engineer?

Dertig minuten, op je eigen site. Geen slides.

We laten je zien:

Welke scripts van derden er nu op je site draaien
Hoe je ervoor staat op PCI DSS 6.4.3 en 11.6.1
Welk deel van je verkeer uit bots en AI-agents bestaat

Liever gewoon een vraag stellen?

Vrije momenten zoeken…

Alleen echte mensen. Wij merken het.

Lukt het boeken niet? Agenda in een nieuw tabblad openen

Wat wil je oplossen?

Vertel het ons in één zin, dan komen we terug met iets bruikbaars in plaats van een standaardverhaal.

Waar we meestal mee helpen:

Zien welke scripts van derden op je site draaien
Bewijs voor PCI DSS 6.4.3 en 11.6.1
Bots, AI-agents en accountovername

Liever meteen een moment inplannen? Kies een tijdstip