Μετάβαση στο περιεχόμενο
BdThemes: επίθεση supply chain μέσω δηλητηριασμένου API και έλεγχος IoCs
Ελένη Γεωργίου
Ελένη Γεωργίου 9 August 2026 · 4 λεπτά ανάγνωσης

BdThemes: επίθεση supply chain μέσω δηλητηριασμένου API και έλεγχος IoCs

Μια παραβίαση στην αλυσίδα εφοδιασμού του οικοσυστήματος BdThemes επέτρεψε την εκτέλεση κακόβουλου JavaScript σε ενεργές συνεδρίες διαχειριστών WordPress. Η επίθεση δεν άλλαξε ούτε ένα αρχείο στα αποθετήρια του WordPress.org: οι δράστες αλλοίωσαν απομακρυσμένες απαντήσεις JSON που τροφοδοτούσαν διαφημιστικά banners στο wp-admin.

Αν χρησιμοποιείτε κάποιο από τα επηρεαζόμενα plugins, αντιμετωπίστε την εγκατάσταση ως πιθανώς παραβιασμένη. Ελέγξτε άμεσα λογαριασμούς, αρχεία plugin, τον κατάλογο Must-Use plugins και τις επιλογές της βάσης δεδομένων για τους δείκτες παραβίασης που ακολουθούν.

Τι συνέβη και γιατί είναι διαφορετικό από μια συνηθισμένη επίθεση supply chain;

Η BdThemes διανέμει plugins που περιλαμβάνουν το εσωτερικό σύστημα Biggopti. Το σύστημα ανακτά promotional banners από API και τα εμφανίζει στον πίνακα διαχείρισης του WordPress. Το API δεν εξυπηρετείται από δυναμικό application server: βασίζεται σε στατικά αρχεία JSON σε bucket του DigitalOcean Spaces, πίσω από Cloudflare.

Οι δράστες απέκτησαν δικαίωμα εγγραφής στο bucket και αντικατέστησαν νόμιμες απαντήσεις JSON με ειδικά κατασκευασμένες τιμές. Η ευπάθεια XSS (Cross-Site Scripting, εκτέλεση script που έχει εισαχθεί σε σελίδα) υπήρχε ήδη στον κώδικα που εμφάνιζε το JSON. Έτσι, το κακόβουλο script εκτελούνταν σιωπηρά στον browser κάθε συνδεδεμένου διαχειριστή, σε κάθε φόρτωση σελίδας του wp-admin.

Δεν απαιτήθηκε ενημέρωση plugin για να μολυνθεί ένα site και δεν άλλαξε αρχείο στον δίσκο. Επομένως, οι έλεγχοι ακεραιότητας αρχείων δεν έβλεπαν την αρχική εκτέλεση, ενώ και ένα Web Application Firewall είχε ελάχιστη ορατότητα σε αυτή τη ροή που ενεργοποιούνταν μέσα στην αυθεντικοποιημένη συνεδρία του διαχειριστή.

Τα επηρεαζόμενα plugins

Στις 7 Αυγούστου 2026, τα παρακάτω plugins έκλεισαν προσωρινά από τον κατάλογο plugins του WordPress, μέχρι να ολοκληρωθεί ο έλεγχος:

  • Element Pack Addons for Elementor – slug bdthemes-element-pack-lite
  • Prime Slider Addons for Elementor – slug bdthemes-prime-slider-lite
  • Pixel Gallery Addons for Elementor – slug pixel-gallery
  • Ultimate Post Kit Addons for Elementor – slug ultimate-post-kit
  • Ultimate Store Kit – Addon For WooCommerce, EDD and Elementor – slug ultimate-store-kit
  • Live Copy Paste for Elementor – slug live-copy-paste
  • Smart Admin Assistant – slug smart-admin-assistant

Η ευπάθεια αφορά διάφορες εκδόσεις της βιβλιοθήκης Biggopti και έχει βαθμολογία CVSS 5.4/10, δηλαδή μέτρια σοβαρότητα. Δεν υπήρχε patch κατά τον χρόνο της δημοσίευσης του περιστατικού. Η πρακτική επίπτωση όμως είναι πολύ σοβαρότερη από τη βαθμολογία της μεμονωμένης XSS, επειδή ο επιτιθέμενος εκτελεί κώδικα ως ήδη συνδεδεμένος administrator.

Η τεχνική αιτία: μη διαφυγή του display_id

Κάθε plugin που χρησιμοποιεί Biggopti φορτώνει JavaScript στο hook admin_init. Το asset εκτελείται χωρίς προϋποθέσεις σε κάθε φόρτωση του wp-admin, ζητά τα δεδομένα των banners από endpoint του κατασκευαστή και δημιουργεί το HTML του notice στο DOM.

Ο κώδικας έπαιρνε το πεδίο display_id από το απομακρυσμένο JSON και το συνέδεε απευθείας σε HTML attribute id, χωρίς escaping στον client:

// Η τιμή έρχεται από απομακρυσμένο JSON.
var f = t.display_id || t.id || "default";
var m = "bdt-admin-biggopti-api-biggopti-" + f;

// Μη ασφαλής σύνθεση HTML: το f δεν έχει escaped.
A = 'id="' + m + '"';

Στον ίδιο κώδικα, το attribute data-display-id δεχόταν escaping με συνάρτηση που αντικαθιστούσε τα &, <, >, και " με HTML entities. Η διαφορετική μεταχείριση δείχνει ότι το id παρέμεινε εκτεθειμένο, παρότι μεταγενέστερες εκδόσεις πρόσθεσαν sanitizer με DOMParser για το πεδίο περιεχομένου του banner. Ο sanitizer αφαιρούσε επικίνδυνα HTML tags και inline event handlers από το περιεχόμενο, όχι όμως από το id.

function escapeHtml(value) {
  return (value || "")
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;");
}

Το μη ασφαλές attribute εισήχθη αρχικά στο Prime Slider 4.1.9, στο SVN revision r3471891, την 1η Μαρτίου 2026. Οι δράστες έβαλαν στο display_id τιμή που έκλεινε το attribute και πρόσθετε handler onanimationstart. Ένα CSS animation τον ενεργοποιούσε περίπου 10 ms μετά τη δημιουργία του στοιχείου, άρα η εκτέλεση γινόταν αθόρυβα με το άνοιγμα οποιασδήποτε σελίδας διαχείρισης.

Πώς εξελισσόταν η μόλυνση

Η καμπάνια χρησιμοποίησε δύο εναλλακτικά payloads, ανάλογα με το endpoint που καλούσε το plugin και τη διαθεσιμότητα της υποδομής των δραστών. Και στις δύο περιπτώσεις, η επίθεση ξεκινούσε από το δηλητηριασμένο JSON του vendor.

Κύριο payload: w2.js

Το κύριο payload εξυπηρετούνταν μέσω του endpoint api-data-all-records. Όταν το w2.js εκτελούνταν στην ενεργή συνεδρία διαχειριστή, ακολουθούσε αυτή την αλυσίδα:

  1. Επικοινωνούσε με το C2 endpoint ia-cdn[.]com/fz/c, στέλνοντας το origin του site για να λάβει οδηγίες στόχευσης. Σταματούσε αν ο server επέστρεφε κατάσταση skip ή done.
  2. Δημιουργούσε νέο χρήστη με ρόλο administrator μέσω του WordPress REST API, αξιοποιώντας το X-WP-Nonce της ενεργής συνεδρίας. Αν αυτό αποτύγχανε, χρησιμοποιούσε τις κλασικές υποβολές φόρμας του WordPress.
  3. Κατέβαζε ZIP που παρουσιαζόταν ως plugin από τον C2 server και το εγκαθιστούσε από την τυπική φόρμα μεταφόρτωσης plugin. Το ZIP χρησιμοποιούσε slug όπως wp-smart-thumbnails ή άλλο ουδέτερο όνομα και περιείχε webshell με όνομα emer-run.php, το οποίο καλούνταν απευθείας μέσω URL.
  4. Το emer-run.php εγκαθιστούσε δύο modules επιμονής στον κατάλογο Must-Use plugins. Τα δείγματα είχαν timestamp που έδειχνε Σεπτέμβριο 2025, ώστε να μοιάζουν με παλιά νόμιμα αρχεία. Τα ονόματα αρχείων μπορούν να αλλάζουν από μόλυνση σε μόλυνση.
  5. Το πρώτο MU plugin παρείχε magic-login backdoor: επέτρεπε μη αυθεντικοποιημένη πρόσβαση διαχειριστή με παράμετρο URL ?_wplogin=<token> και στόχευε τον παλαιότερο εγγεγραμμένο administrator του site.
  6. Το δεύτερο MU plugin λειτουργούσε ως anti-analysis module. Έκανε hook στα database queries του WordPress, έκρυβε τους κακόβουλους λογαριασμούς από τη λίστα χρηστών και μείωνε αντίστοιχα τον συνολικό αριθμό χρηστών που εμφανίζει η διαχείριση.
  7. Έστελνε τα αποτελέσματα κάθε σταδίου πίσω στον C2 server με navigator.sendBeacon.

Εναλλακτικό payload: x.js

Το δεύτερο script, x.js, φιλοξενούνταν απευθείας στην υποδομή της BdThemes και εξυπηρετούνταν σε plugins που χρησιμοποιούσαν το endpoint api-data-records. Δημιουργούσε προβλέψιμα credentials administrator από το hostname του θύματος: υπολόγιζε έναν ακέραιο hash, τον μετέτρεπε σε base36, κρατούσε τους πρώτους έξι χαρακτήρες και έφτιαχνε username της μορφής bd_<hash>.

Ο κωδικός ακολουθούσε το μοτίβο Bd@26!<hash>x και το email ήταν <username>@wordpress.org. Επειδή τα credentials παράγονται ντετερμινιστικά από το hostname, οι δράστες δεν χρειάζεται να κρατούν κεντρική λίστα μολυσμένων sites. Αν ερευνάτε ύποπτο domain, μπορείτε να αναζητήσετε λογαριασμό που ταιριάζει στο μοτίβο και να συσχετίσετε τον κωδικό με τον υπολογισμένο hash.

Το script ζητούσε τη σελίδα /wp-admin/user-new.php, έβρισκε το nonce δημιουργίας χρήστη και υπέβαλλε φόρμα που όριζε τον νέο λογαριασμό ως administrator. Αν η δημιουργία πετύχαινε ή ο χρήστης υπήρχε ήδη, έστελνε στον C2 την κατάσταση, το username, τον κωδικό, το origin, URL αποσύνδεσης και το URL της σελίδας. Αποθήκευε επίσης flag στο localStorage, όταν αυτό ήταν διαθέσιμο, ώστε να μην επαναλαμβάνει τη διαδικασία στον ίδιο browser.

Δείκτες παραβίασης

Αναζητήστε όλους τους παρακάτω δείκτες. Μην περιοριστείτε σε έναν έλεγχο λίστας χρηστών μέσα από το wp-admin, γιατί το stealth MU plugin μπορεί να αποκρύπτει λογαριασμούς και να αλλοιώνει τα εμφανιζόμενα σύνολα.

Δίκτυο και απομακρυσμένοι πόροι

  • Κύριο payload: ia-cdn[.]com/fz/w2.js
  • C2 beacon endpoint: ia-cdn[.]com/fz/c
  • Δηλητηριασμένο endpoint: api[.]sigmative[.]io/prod/store/api/biggopti/api-data-all-records
  • Δηλητηριασμένο endpoint: api[.]sigmative[.]io/prod/store/api/biggopti/api-data-records
  • Δηλητηριασμένο script: api[.]sigmative[.]io/prod/store/api/biggopti/x.js

Τα δύο endpoints JSON επέστρεφαν καθαρό JSON από τις 8 Αυγούστου 2026. Αυτό δεν αρκεί για να θεωρήσετε ένα site καθαρό: αν κάποιος administrator άνοιξε το wp-admin όσο το payload ήταν ενεργό, η επίθεση μπορούσε ήδη να έχει δημιουργήσει λογαριασμούς και μηχανισμούς επιμονής.

Αρχεία και checksums

  • Webshell: emer-run.php – MD5 1024732009983dd5e54b4cf5593f04d4
  • MU-plugin magic-login backdoor: class-wp-token-validate.php – MD5 7719cd98a35ffad2771f26d1ceab7d27
  • MU-plugin stealth module: class-wp-query-9d127ff3.php, ή παραλλαγή ονόματος class-wp-query-*.php – MD5 9aadc3e5c5242b273bd17c5bdc358845
  • MU-plugin που εμφανίζεται ως health check: wp-cache-optimizer.php – MD5 e450ae5bc4bfc0d960dded06a76bb8e9

Βάση δεδομένων και χρήστες

  • Option fz_emer_login_tokens, όπου αποθηκεύονται magic-login tokens.
  • Option fz_emer_done_v1, που δηλώνει ότι ολοκληρώθηκε η παραβίαση.
  • Λογαριασμοί με email domain @wordpress.org ή @developer.wordpress.org.
  • Usernames που ταιριάζουν στο μοτίβο bd_ ακολουθούμενο από έξι αλφαριθμητικούς χαρακτήρες.

Άμεσα βήματα ελέγχου και αποκατάστασης

Απομονώστε πρώτα το site από την πρόσβαση διαχειριστών ή περιορίστε προσωρινά το wp-admin, ώστε να μη δημιουργούνται νέες ενεργές συνεδρίες όσο ερευνάτε. Κρατήστε αντίγραφο της βάσης δεδομένων και του filesystem πριν αφαιρέσετε στοιχεία, γιατί θα χρειαστείτε τα ευρήματα για να προσδιορίσετε την έκταση της παραβίασης.

  1. Καταγράψτε ποια από τα επτά plugins είναι ή ήταν εγκατεστημένα και ελέγξτε αν κάποιος administrator φόρτωσε το wp-admin από τις 23 Ιουνίου έως τις 8 Αυγούστου 2026.
  2. Εξετάστε τη βάση δεδομένων απευθείας για users με τα ύποπτα usernames και email domains. Συγκρίνετε τη λίστα με γνωστούς νόμιμους λογαριασμούς, επειδή η διαχειριστική οθόνη μπορεί να αποκρύπτει εγγραφές.
  3. Ελέγξτε τον κατάλογο wp-content/mu-plugins/ για τα ονόματα, τα hashes και τυχόν άγνωστα αρχεία με παλιές ή ασυνήθιστες ημερομηνίες. Ελέγξτε επίσης τα εγκατεστημένα plugins για το emer-run.php και για plugin με slug όπως wp-smart-thumbnails.
  4. Αναζητήστε τις επιλογές fz_emer_login_tokens και fz_emer_done_v1 στον πίνακα options. Επιθεωρήστε τα περιεχόμενα πριν τα διαγράψετε.
  5. Ελέγξτε access logs, DNS logs και outbound requests για τις διευθύνσεις ia-cdn[.]com και api[.]sigmative[.]io που αναφέρονται στους δείκτες.
  6. Διαγράψτε κακόβουλους χρήστες, webshells, MU plugins και options μόνο αφού επιβεβαιώσετε ότι πρόκειται για ευρήματα της καμπάνιας. Ελέγξτε ξανά τη βάση και το filesystem μετά την αφαίρεση.
  7. Αλλάξτε κωδικούς για όλους τους administrators, ανανεώστε WordPress salts και τερματίστε ενεργές συνεδρίες. Ελέγξτε ιδιαίτερα τον παλαιότερο λογαριασμό administrator, επειδή τον στόχευε το magic-login backdoor.
  8. Επανεγκαταστήστε από αξιόπιστη πηγή τα επηρεαζόμενα plugins και επανεξετάστε αν τα χρειάζεστε. Μη βασιστείτε μόνο σε ενημέρωση ή επανεγκατάσταση plugin για να αφαιρέσετε επιμονή που έχει ήδη γραφτεί σε MU plugins και στη βάση δεδομένων.

Χρονολόγιο του περιστατικού

  • 1 Μαρτίου 2026: Το JavaScript του Biggopti API προστέθηκε στο Prime Slider 4.1.9, στο SVN r3471891. Το display_id εισήχθη χωρίς escaping στο attribute id και χρησιμοποιήθηκε το endpoint api-data-records.
  • 10 Μαΐου 2026: Το endpoint άλλαξε σε api-data-all-records. Προστέθηκε sanitizer με DOMParser για το πεδίο περιεχομένου, αλλά το id συνέχισε να μην έχει escaping.
  • 23 Ιουνίου 2026: Η τιμή start_date της καμπάνιας στο δηλητηριασμένο API αντιστοιχεί σε notice «Summer Sale». Αυτή είναι η παλαιότερη πιθανή ημερομηνία ενεργής XSS.
  • 6 Αυγούστου 2026, 22:40 UTC: Καταγράφηκε το τελευταίο Last-Modified για το δηλητηριασμένο api-data-records.
  • 7 Αυγούστου 2026, 09:11 UTC: Καταγράφηκε το τελευταίο Last-Modified για το δηλητηριασμένο api-data-all-records.
  • 7 Αυγούστου 2026: Η επίθεση εντοπίστηκε ενεργή και τα plugins έκλεισαν στον κατάλογο του WordPress μέχρι να ελεγχθούν.
  • 7 Αυγούστου 2026, 16:56 UTC: Συλλέχθηκαν artifacts της έρευνας.
  • 8 Αυγούστου 2026: Και τα δύο API endpoints επέστρεφαν πλέον καθαρό JSON.

Τι πρέπει να κρατήσετε

Η επίθεση δείχνει ότι η ασφάλεια ενός plugin δεν εξαρτάται μόνο από τα αρχεία που εγκαθιστάτε. Κάθε απομακρυσμένο feed που φορτώνεται στο wp-admin αποτελεί τμήμα της αλυσίδας εμπιστοσύνης και χρειάζεται αυστηρή επικύρωση και escaping πριν περάσει στο DOM.

Ελέγξτε τώρα τα sites που χρησιμοποιούν plugins της BdThemes με βάση τους συγκεκριμένους δείκτες, ακόμη και αν τα API endpoints έχουν καθαριστεί και τα αρχεία των plugins δεν εμφανίζουν αλλαγές. Αν βρείτε backdoor, κρυφό administrator ή ενδείξεις outbound επικοινωνίας με το C2, αντιμετωπίστε το περιστατικό ως πλήρη παραβίαση του WordPress περιβάλλοντος και ερευνήστε όλα τα credentials και τα συστήματα που συνδέονται με αυτό.

Ελένη Γεωργίου

Ελένη Γεωργίου

Προγραμματίστρια τουριστικής τεχνολογίας και πλατφορμών φιλοξενίας. Συστήματα online κρατήσεων και λογισμικό φιλοξενίας είναι ο τομέας μου. Η μεσογειακή φιλοξενία λειτουργεί και ψηφιακά.

Όλες οι αναρτήσεις

Γίνετε μέλος της κοινότητας HelloWP!

Συζητήστε μαζί μας για WordPress, web development και μοιραστείτε εμπειρίες με άλλους προγραμματιστές.

- μέλη
- σε σύνδεση
Συμμετοχή

Χρησιμοποιούμε cookies για να βελτιώσουμε την εμπειρία σας. Συνεχίζοντας, συμφωνείτε με την Πολιτική Cookies μας.