30 Σεπτεμβρίου 2026 Hardware Security · Microarchitecture ~15 λεπτά ανάγνωση Spectre v2 · BTR

Spectre v2 BTR: Πώς ένα «stale» prediction δίνει root password hash

Την 29η Σεπτεμβρίου 2026, οι ομάδες των VUSec (Vrije Universiteit Amsterdam) και Scuola Superiore Sant'Anna αποκάλυψαν το Branch Target Reuse (BTR): μια νέα παραλλαγή του Spectre v2 που δεν χρειάζεται cross-context mistraining — αρκεί ένα stale branch target που επιβίωσε από το JIT code reuse. Αποτέλεσμα, όπως έδειξαν: δύο end-to-end exploits στον πυρήνα Linux μέσω unprivileged cBPF που διαρρέουν root password hash, σε Intel, AMD και Arm. Το πλήρες deep dive — με διαδραστικό προσομοιωτή BTB για να δεις το primitive με τα μάτια σου.

00 //TL;DR — τα βασικά σε 90 δευτερόλεπτα

Τι συνέβηΣτις 29/9/2026 δημοσιοποιήθηκε το Branch Target Reuse (BTR) — νέα Spectre v2 παραλλαγή από VUSec (VU Amsterdam) και Scuola Superiore Sant'Anna — που χτυπά τους JIT compilers πυρήνα, browsers και runtimes.
Η ιδέα-κλειδίΟι CPUs επαναφέρουν τη «συνέπεια κώδικα» όταν η μνήμη ξαναγράφεται, αλλά δεν ακυρώνουν πάντα τα stale branch targets του predictor. Αυτά επιβιώνουν, ξαναχρησιμοποιούνται — και δημιουργούν ένα speculative execute-after-free.
Τι χτυπάJIT engines: ο cBPF JIT του Linux, ο GraalVM της Oracle και ο SpiderMonkey (Firefox). CPUs: Intel, AMD, Arm.
Τι διαρρέειΔύο end-to-end exploits στον πυρήνα Linux μέσω cBPF — προσβάσιμου σε unprivileged χρήστες (seccomp, socket/packet filtering, Docker, Chrome). Σε σύγχρονους Intel: root password hash από τη μνήμη.
Τα «αλλά»Δεν αναφέρεται CVE στα δημοσιεύματα· δεν υπάρχει ακόμη πλήρες browser exploit («εφικτό» κατά τους ερευνητές)· δεν έχουμε δει δημόσια δήλωση κατασκευαστών — τα κλασικά retpoline/eIBRS δεν καλύπτουν το BTR.
Τι κάνειςΔεν είναι remote, από μόνο του: απαιτεί τοπική εκτέλεση κώδικα. Δες τον οδηγό άμυνας ανά ρόλο και παίξε με τον προσομοιωτή BTB για να καταλάβεις γιατί το stale entry είναι το όλο θέμα.

01 //Spectre 101: prediction, speculation και το «κρυφό βιβλίο» του BTB

Για να καταλάβεις το BTR, πρέπει πρώτα να αποδεχτείς μια ενοχλητική αλήθεια: ο σύγχρονος επεξεργαστής εκτελεί κώδικα που δεν έχει αποφασίσει ακόμα αν πρέπει να εκτελέσει. Αυτό δεν είναι bug — είναι η ίδια η αρχιτεκτονική απόδοσης που κουβαλάμε από τα τέλη της δεκαετίας του '90.

Γιατί υπάρχει ο branch predictor

Ένας πυρήνας έχει pipeline βάθους 15–20+ σταδίων. Στα conditional branches (if/else) ο predictor «μαντεύει» την κατεύθυνση. Στα indirect branches — jump tables, virtual calls, dispatch loops, και τα κρίσιμα για εμάς: τις έμμεσες μεταβάσεις των JIT engines και των interpreters — ο επεξεργαστής δεν ξέρει καν πού πάει μέχρι να υπολογιστεί η διεύθυνση προορισμού. Η λύση λέγεται BTB (Branch Target Buffer): ένα μικρό, εξαιρετικά γρήγορο «ευρετήριο» που αποθηκεύει ζεύγη (διεύθυνση branch → προβλεπόμενος στόχος), εκπαιδευμένο στην ιστορία εκτέλεσης.

Όταν η πρόβλεψη είναι σωστή, κερδίζεις δεκάδες κύκλους. Όταν είναι λάθος, το pipeline εκκαθαρίζεται και χάνεις 15–20+ κύκλους. Γι' αυτό οι κατασκευαστές κάνουν τα πάντα για να «προβλέπουν καλά» — και γι' αυτό οι λεπτομέρειες του predictor είναι από τα πιο απόρρητα σημεία ενός chip.

Speculative execution: το ρολόι γυρίζει πίσω — εκτός από τα «ψιλά γράμματα»

Πάνω στην πρόβλεψη, ο πυρήνας εκτελεί speculatively: τρέχει εντολές στον μαντεμένο δρόμο πριν επιβεβαιωθεί. Αν η πρόβλεψη αποδειχθεί λάθος, η αρχιτεκτονική κατάσταση (registers, μνήμη) επαναφέρεται — σαν να μη συνέβη τίποτα. Όμως η μικροαρχιτεκτονική κατάσταση δεν επαναφέρεται: caches, ιστορικά πρόβλεψης, και — το θέμα μας — οι εγγραφές του BTB. Αυτό το «γκρίζο» ίχνος είναι η μαγιά όλων των επιθέσεων Spectre από το 2018.

CVESpectre v2 = CVE-2017-5715 (2018)
Μηχανισμός 2018Branch Target Injection: ο attacker εκπαιδεύει τον predictor για λογαριασμό του θύματος
ΆμυνεςRetpoline, IBRS/eIBRS, IBPB, STIBP, microcode
ΕξέλιξηBHI (2022): το history injection ξεπερνά το eIBRS — ίδια σχολή, ίδιο μοτίβο
«Η βασική ιδέα πίσω από την επίθεση είναι ότι οι σύγχρονοι επεξεργαστές επαναφέρουν τη συνέπεια κώδικα μετά από self-modification, αλλά δεν ακυρώνουν απαραίτητα τις stale εγγραφές indirect branch prediction (τα branch targets).» — Οι ερευνητές των VUSec / Scuola Superiore Sant'Anna για το BTR “The key insight behind the attack is that, while modern CPUs restore architectural code coherence after self-modification, they do not necessarily invalidate stale indirect branch prediction entries (i.e., branch targets).”

Η διαφορά που κάνει το BTR ξεχωριστό είναι ο φορέας. Στο κλασικό Spectre v2 ο επιτιθέμενος είναι «εξωτερικός»: δηλητηριάζει τον predictor με δικό του κώδικα και μετά «πατάει trigger» για να τρέξει το θύμα τον λάθος δρόμο. Στο BTR, ο ίδιος ο κώδικας του θύματος παράγει τις stale εγγραφές — ένας JIT compiler που ξαναγράφει μηχανικό κώδικα σε πραγματικό χρόνο. Ο επιτιθέμενος δεν χρειάζεται να «μολύνει» τον predictor· απλώς περιμένει το ληγμένο εισιτήριο που άφησε ο JIT.

02 //Ο JIT που ξαναγράφει τον εαυτό του: το ιδανικό θύμα

JIT (Just-In-Time) compiler είναι ένα πρόγραμμα που μεταφράζει bytecode ή ενδιάμεσο κώδικα σε μηχανικό κώδικα την ώρα που εκτελείται — και ύστερα τον ξαναγράφει, όταν αλλάξει η κατάσταση του προγράμματος. Τους συναντάς παντού:

  • Πυρήνας Linux: ο cBPF JIT (και ο eBPF JIT) μετατρέπουν φίλτρα πακέτων/seccomp σε native κώδικα για ταχύτητα. Ο classic cBPF παραμένει προσβάσιμος σε unprivileged χρήστες μέσω socket filters και seccomp — και κατά συνέπεια Docker και Chrome, που στηρίζονται στο seccomp, τον χρησιμοποιούν καθημερινά.
  • Browsers: ο SpiderMonkey του Firefox (JavaScript/Wasm) μεταγλωττίζει προοδευτικά («tiering») τον κώδικα που φτάνει σε hot paths — ο browser είναι, δομικά, μια μηχανή παραγωγής και αναδιαμόρφωσης εκτελέσιμου κώδικα.
  • Runtimes: ο GraalVM της Oracle (JVM/JS/γλώσσες Truffle) παράγει JIT κώδικα σε μεγάλη έκταση.

Τι συμβαίνει στη μνήμη όταν αλλάζει ο κώδικας

Ένας JIT εκχωρεί σελίδες, γράφει εκεί native κώδικα, τις καθιστά εκτελέσιμες (ιδανικά με W^X: ποτέ writable και executable μαζί) και, όταν ο κώδικας «ξεπεραστεί» (deoptimization, tier-up, hot-swap), τον απελευθερώνει ή τον ξαναγράφει. Ο allocator επαναχρησιμοποιεί τις διευθύνσεις: η νέα συνάρτηση που μόλις βελτιστοποιήθηκε μπορεί να «προσγειωθεί» ακριβώς εκεί που έμενε η παλιά — με άλλα offsets, άλλους κλάδους, άλλα έμμεσα jumps.

Κρίσιμο σημείοΟι επεξεργαστές «σέβονται» το self-modifying code σε αρχιτεκτονικό επίπεδο — snoops, fences, code-coherence μηχανισμοί — ώστε ο νέος κώδικας να εκτελείται σωστά. Όμως αυτοί οι μηχανισμοί δεν ενημερώνουν τις δομές πρόβλεψης. Το BTB δεν παίρνει «μνημόνιο» ότι το περιεχόμενο στη διεύθυνση X άλλαξε: κρατά μια πρόβλεψη φτιαγμένη για τον παλιό κώδικα στη X. Αυτή είναι μία stale indirect branch prediction entry: ένα εισιτήριο με ληγμένη ημερομηνία, που η πύλη όμως ξανασκανάρει.

Πρόσεξε γιατί οι JIT compilers είναι ο ιδανικός ξενιστής για μια επίθεση αυτού του τύπου:

  • Υψηλή εναλλαγή κώδικα: σε έναν browser ο JIT «ξαναχτίζει» συνεχώς συναρτήσεις — οι stale εγγραφές παράγονται από τη φυσιολογική λειτουργία, χωρίς ο attacker να χρειάζεται να «κάψει» κάτι για να τις δημιουργήσει.
  • Επαναχρησιμοποίηση διευθύνσεων: τα code caches ανακυκλώνουν τη μνήμη· το ίδιο virtual address φιλοξενεί, μεσοπρόθεσμα, πολλές γενιές κώδικα.
  • Επιρροή του attacker: σε cBPF το «πρόγραμμα» που JIT-άρεται είναι είσοδος του χρήστη. Ο επιτιθέμενος επηρεάζει το σχήμα του παραγόμενου κώδικα — άρα και το πού «πατάνε» τα obsolete offsets.
  • Unprivileged στοίβασμα: eBPF απαιτεί δικαιώματα — το classic cBPF όχι. Μένει ζωντανό ακριβώς για συμβατότητα, σε seccomp (Docker, Chrome) και socket/packet filters.

Και μια διευκρίνιση για τους «καλούς»: W^X, constant blinding, randomization και JIT hardening βοηθούν — ανεβάζουν το κόστος του exploit engineering. Δεν ακυρώνουν όμως το υποκείμενο primitive: ότι μια πρόβλεψη μπορεί να ζήσει περισσότερο από τον κώδικα για τον οποίο δημιουργήθηκε.

03 //BTR βήμα-βήμα: πώς μια ληγμένη πρόβλεψη γίνεται speculative execute-after-free

Ήρθε η ώρα να δούμε το primitive με τη σειρά που το περιγράφουν οι ερευνητές. Το σενάριο είναι σκόπιμα «βαρετό» — σκέψου ένα φίλτρο cBPF που αντικαθίσταται, ή μια συνάρτηση JS που ο JIT ξαναβελτιστοποιεί. Η μαγεία δεν είναι στον κώδικα· είναι στο τι θυμάται το BTB όταν ο κώδικας φύγει.

  1. Εκπαίδευση. Ο JIT παράγει τη γενιά #1 ενός κομματιού κώδικα (ας το πούμε F1). Μέσα της υπάρχει ένα indirect branch στη διεύθυνση B. Καθώς εκτελείται, το BTB μαθαίνει τη μετάβαση: BTB[B] → T, όπου T είναι ένας στόχος μέσα στη F1 (π.χ. ένας dispatch helper στο offset +0x40).
  2. Η γενιά #1 πεθαίνει. Το φίλτρο αντικαθίσταται / η συνάρτηση απο-βελτιστοποιείται / γίνεται tier-up. Ο κώδικας της F1 ελευθερώνεται και η σελίδα (ή το slot στο code cache) επαναχρησιμοποιείται.
  3. Η γενιά #2 χτίζεται στην ίδια διεύθυνση. Ο JIT γράφει τη νέα συνάρτηση F2 — με το δικό της indirect branch στην ίδια σχετική θέση B (τα templates των JIT μοιάζουν μεταξύ τους). Οι αρχιτεκτονικοί μηχανισμοί coherence φροντίζουν ώστε η εκτέλεση να «δει» τον νέο κώδικα σωστά. Το BTB όμως δεν ενημερώνεται: η εγγραφή BTB[B] → T επιβιώνει.
  4. Το stale target δείχνει… στο πουθενά που τώρα είναι κάτι άλλο. Το T ήταν ένα offset με νόημα στη F1. Στη F2, η ίδια διεύθυνση πέφτει σε διαφορετικό σημείο του νέου κώδικα — αυτό που οι ερευνητές ονομάζουν obsolete offset: μια θέση που είχε νόημα στη γενιά #1 και τώρα σημαίνει κάτι άλλο. Επειδή ο attacker επηρεάζει το σχήμα της F2 (θυμήσου: το JIT-άρισμα προέρχεται από δική του είσοδο), μπορεί να «σμιλέψει» το τι βρίσκεται εκεί.
  5. Speculative hijack. Όταν εκτελεστεί το indirect branch στη B, ο front-end πιστεύει το stale entry και ακολουθεί speculatively το παλιό T — μέσα στον νέο κώδικα, σε offset που δεν θα ήταν ποτέ νόμιμος στόχος. Αν εκεί «κάθεται» ένα sequence που αγγίζει ένα μυστικό (π.χ. δεδομένα credential από τη μνήμη του πυρήνα) και το «στεγάζει» σε μια θέση cache ανάλογα με τα bits του, ο κύκλος κλείνει με timing side channel.
BTB[0x7f2c1a40] = 0x7f2c1a80   ; μάθανε από τη F1 — γενιά #1

F1 @ 0x7f2c1000   ; κώδικας v1 (φίλτρο/συνάρτηση) — ελευθερώθηκε
F2 @ 0x7f2c1000   ; νέος κώδικας v2 — η ίδια σελίδα ανακυκλώθηκε

exec   @ 0x7f2c1a40   ; indirect branch της F2
  ├─ predicted → 0x7f2c1a80   ; STALE target — obsolete offset
  ├─ speculative fetch εκεί     ; speculative execute-after-free
  └─ architectural rollback      ; …αλλά το cache κρατά το ίχνος
Γιατί «execute-after-free»;Σε ένα κλασικό use-after-free η μνήμη ελευθερώνεται, επαναχρησιμοποιείται, και κάποιος δείκτης εξακολουθεί να «δείχνει» εκεί. Εδώ το «free» δεν είναι bug κώδικα: είναι η λογική ζωή μιας γενιάς κώδικα. Η θέση της ανακυκλώνεται· η πρόβλεψη όμως που «αναφέρεται» σε αυτήν δεν καθαρίζεται, και ο πυρήνας speculatively «πληρώνει» για κώδικα που δεν υπάρχει πια — σε μια θέση όπου τώρα υπάρχει άλλος κώδικας, έτσι όπως τον διαμόρφωσε ο attacker.

Ένα σημείο που αξίζει να τονιστεί: το BTR δεν απαιτεί cross-privilege «δηλητηρίαση». Δεν χρειάζεται ο attacker να εκπαιδεύσει τον predictor της victim με τεχνητά συμβάντα από άλλο context (αυτό που κάνει το κλασικό branch target injection). Το BTB «αυτο-μολύνεται» από τη φυσική ροή του JIT — και γι' αυτό οι καθιερωμένες άμυνες δεν το αγγίζουν.

Προϋπόθεση 1JIT churn: συνεχής παραγωγή/απόσυρση μηχανικού κώδικα
Προϋπόθεση 2Address reuse: ο νέος κώδικας να πέσει στις παλιές διευθύνσεις
Προϋπόθεση 3Επιρροή στο layout από τον attacker (π.χ. περιεχόμενο φίλτρου/JS)
Προϋπόθεση 4Κανάλι παρατήρησης (cache timing) για να «διαβαστεί» η διαρροή

Οι ερευνητές μελέτησαν το φαινόμενο σε τρεις διαφορετικούς κόσμους JIT — Linux cBPF, Oracle GraalVM, SpiderMonkey — δείχνοντας ότι πρόκειται για γενικό πρόβλημα της αλληλεπίδρασης CPU/JIT και όχι για ένα μεμονωμένο quirk ενός runtime. Στις επόμενες ενότητες βλέπουμε πού το πήγαν ένα βήμα παρακάτω: σε δύο end-to-end exploits στον πυρήνα του Linux.

04 //Το μονοπάτι cBPF: δύο end-to-end exploits στον πυρήνα Linux

Ένα security primitive αποκτά βάρος όταν κάποιος το «κλείσει» σε end-to-end επίθεση. Οι ερευνητές έφτιαξαν δύο exploits που αξιοποιούν το BTR μέσω του classic BPF (cBPF) του πυρήνα Linux.

Γιατί το cBPF είναι το «ανοιχτό παράθυρο»

  • Δεν χρειάζεται δικαιώματα. Ο eBPF JIT είναι προνόμιο αυξημένων χρηστών — αλλά ο cBPF παραμένει προσβάσιμος σε unprivileged προγράμματα: socket filters, packet filtering, και κυρίως seccomp.
  • Είναι παντού. Το seccomp είναι ο ακρογωνιαίος λίθος της απομόνωσης σε Docker containers και στον sandbox του Chrome. Ο πυρήνας μεταγλωττίζει τα cBPF προγράμματά τους σε native κώδικα με τον JIT (ή, ανάλογα με τη ρύθμιση, τα ερμηνεύει — σημαντικό αυτό, θα το δούμε στις άμυνες).
  • Ο attacker γράφει το «πρόγραμμα». Τα φίλτρα είναι είσοδος του χρήστη· το παραγόμενο machine code εξαρτάται από αυτά. Άρα κάθε προϋπόθεση του BTR — churn, address reuse, layout control — είναι, σε μεγάλο βαθμό, στα χέρια του επιτιθέμενου.

Η αλυσίδα της επίθεσης (όπως τη συνοψίζει η δημοσιοποίηση)

  1. Φόρτωσε/αντικατέστησε διαδοχικά φίλτρα ώστε να παράγεται και να αποσύρεται κώδικας στην ίδια περιοχή — οι stale εγγραφές του BTB συσσωρεύονται.
  2. Προκάλεσε εκτέλεση των indirect branches ώστε το BTB να «μάθει» στόχους που θα γίνουν obsolete όταν ανακυκλωθεί η σελίδα.
  3. Φτιάξε τη νέα γενιά κώδικα έτσι ώστε τα obsolete offsets να «χτυπάνε» σε επιθυμητές ακολουθίες — το speculative window που θα οδηγήσει σε διαρροή.
  4. Trigger + timing side channel: το speculative ίχνος στη cache αποκαλύπτει τα bits του μυστικού — που στη συγκεκριμένη ανάλυση είναι root password hash από τη μνήμη (σε σύγχρονους Intel).
Γιατί password hashΈνα password hash είναι «πρώτη ύλη»: δεν δίνει άμεσα κωδικό, αλλά επιτρέπει offline cracking, επιβεβαίωση επαναχρησιμοποίησης κωδικών και pivot σε άλλα συστήματα. Είναι επίσης το είδος δεδομένου που κάθεται σε μνήμη πυρήνα/υποσυστήματα authentication — γι' αυτό μια speculative διαρροή με ορίζοντα kernel credentials δεν είναι «ακαδημαϊκή ανησυχία», αλλά σημείο καμπής.
Τι δεν ξέρουμε (ακόμη)Από τα δημοσιεύματα της 29/9 δεν αναφέρεται CVE, δημόσιο PoC ή δηλώσεις κατασκευαστών. Δεν έχουν δημοσιοποιηθεί λεπτομέρειες για την αξιοπιστία/ταχύτητα της διαρροής («πόσα λεπτά/ώρες χρειάζεται»). Το μόνο μετρικό που πέρασε στα ρεπορτάζ: δύο end-to-end exploits στον πυρήνα Linux και έναν πλήρη browser exploit που δεν έχει (ακόμη) κατασκευαστεί. Κρατάμε, λοιπόν, την αξιολόγηση σε επίπεδο ικανότητας — όχι «κυκλοφορεί στο διαδίκτυο».

Αξίζει να σχολιάσουμε και το ερευνητικό πλαίσιο: οι JIT engines που αναλύθηκαν (cBPF, GraalVM, SpiderMonkey) επιλέχθηκαν γιατί καλύπτουν τρεις διαφορετικές «γλώσσες» JIT — kernel filter bytecode, JVM οικοσύστημα, και JavaScript/Wasm. Η ίδια η ύπαρξη του BTR σε αυτό το τρίπτυχο υποδηλώνει ότι το ζήτημα δεν είναι «bug» ενός προϊόντος αλλά σχεδιαστική ιδιομορφία της αλληλεπίδρασης CPU ↔ code-generating software.

05 //Πόσο ρεαλιστική είναι η απειλή;

Η ειλικρινής απάντηση: σοβαρή, αλλά όχι «πατήστε-ένα-link-και-έγινε». Το BTR απαιτεί, από σήμερα, τοπική εκτέλεση κώδικα στο μηχάνημα-στόχο — ή ένα browser exploit που (ακόμη) δεν υπάρχει. Ας δούμε όμως τις επιφάνειες μία-μία:

ΕπιφάνειαUnprivileged;Status στην έρευναΠρακτικό σχόλιο
Linux cBPF JIT (socket filters, seccomp) Ναι 2 end-to-end exploits Το μονοπάτι της δημοσιοποίησης. Docker default profile & Chrome sandbox βασίζονται στο seccomp.
Linux eBPF JIT Όχι (privileged) Δεν είναι ο αποδεδειγμένος vector Απαιτεί δικαιώματα — το κλασικό cBPF καλύπτει το unprivileged κενό.
SpiderMonkey (Firefox / JS & Wasm) Web content: θεωρητικά Primitive μελετήθηκε· browser exploit: όχι ακόμη Οι ερευνητές το χαρακτηρίζουν «εφικτό». Αν ωριμάσει PoC → drive-by σενάριο.
GraalVM (JVM οικοσύστημα) In-process code Primitive αποδείχθηκε Multi-tenant JVM platforms και plugin hosts: βάλε το στη threat model.
Άλλοι JITs (V8, JavaScriptCore κ.λπ.) — Δεν καλύφθηκαν στη δημοσιοποίηση Ανοιχτό ερώτημα: κανείς δεν δηλώνει «καθαρός» — ούτε όμως αποδεδειγμένα εκτεθειμένος.

Τα σενάρια που πονάνε περισσότερο

  • Multi-tenant hosts & CI runners: μη έμπιστος κώδικας που τρέχει δίπλα σε builds με secrets. Η «γειτονιά» γίνεται το threat model — speculative διαρροή credential material με ορίζοντα kernel.
  • Containers: κάθε container έχει seccomp filters — δηλαδή cBPF JIT κώδικα. Η ίδια η τεχνολογία απομόνωσης που εμπιστευόμαστε κουβαλά την επιφάνεια.
  • Desktop malware / exploit chains: τοπική εκτέλεση είναι προϋπόθεση, αλλά το «κέρδος» αλλάζει ποιότητα: μυστικά τύπου password hash χωρίς memory-corruption exploit — stealth pivot με λιγότερα ίχνη.
  • Browser (όταν/αν): ο browser είναι η μόνη επιφάνεια όπου ο attacker αποκτά «δωρεάν» εκτέλεση κώδικα (JS/Wasm) χωρίς τοπικό access. Γι' αυτό το «feasible» των ερευνητών για web attacks είναι η φράση-κλειδί που κρατάει το ραντάρ ζωντανό.
Τι δεν είναιΔεν είναι remote exploit από το πουθενά, ούτε wormable μόνο του, ούτε «χακάρονται όλοι οι επεξεργαστές σήμερα». Δεν υπάρχει (ακόμη) δημόσιο PoC στα δημοσιεύματα, ούτε CVE. Το πρακτικό ρίσκο κλιμακώνεται όπου μη έμπιστος κώδικας συνυπάρχει με ευαίσθητα μυστικά στο ίδιο μηχάνημα.
Γιατί το παίρνουμε σοβαράΓιατί είναι κατηγορία, όχι συμβάν: CPU + JIT είναι πανταχού παρόντες, οι stale εγγραφές παράγονται από φυσιολογική λειτουργία, και οι άμυνες που στήσαμε μετά το 2018 σχεδιάστηκαν για άλλο μοντέλο επίθεσης. Είναι, επίσης, άλλη μία υπενθύμιση ότι οι «λεπτομέρειες απόδοσης» του hardware αποτελούν διαρκώς επαναχρησιμοποιήσιμη επιφάνεια πληροφορίας.

06 //Γιατί οι άμυνες του 2018 δεν αρκούν

Αυτό είναι το πιο σημαντικό μάθημα του BTR: δεν είναι «άλλη μία» παραλλαγή που την πιάνει το retpoline. Οι καθιερωμένες άμυνες κατά του Spectre v2 σχεδιάστηκαν για ένα συγκεκριμένο μοντέλο απειλής — και το BTR ζει έξω από αυτό.

Τι κάνουν (και τι δεν κάνουν) τα retpoline / eIBRS / IBPB

Το κλασικό branch target injection απαιτεί ο επιτιθέμενος να εκπαιδεύσει τον predictor — να δημιουργήσει εκείνος εγγραφές που θα χρησιμοποιήσει το θύμα. Όλες οι μεγάλες άμυνες επιτίθενται ακριβώς σε αυτή τη διαδικασία:

  • Retpoline: μετατρέπει τα indirect branches σε ασφαλείς «παγίδες» ώστε η speculation να μην μπορεί να ακολουθήσει δηλητηριασμένο στόχο.
  • IBRS / eIBRS: περιορίζουν ποια πρόβλεψη επιτρέπεται ανά privilege level — σταματούν την cross-privilege δηλητηρίαση.
  • IBPB / STIBP: «σβήνουν» ή απομονώνουν την κατάσταση πρόβλεψης στα context switches.

Το BTR όμως δεν χρειάζεται εκπαίδευση από τον attacker. Η stale εγγραφή δημιουργήθηκε από τον ίδιο τον κώδικα του θύματος (τον JIT), μέσα στο ίδιο execution context, με τη φυσιολογική ροή εκτέλεσης. Δεν υπάρχει cross-context στιγμή για να πιάσουν τα IBRS/IBPB· δεν υπάρχει indirection για να «κλείσει» το retpoline. Είναι, ας πούμε, σαν να έχεις κλειδαριά ασφαλείας στην πόρτα — και το πρόβλημα να είναι το πάτωμα.

Αμυντικό μέτροΚαλύπτει BTR;Γιατί
RetpolineΌχιΑπευθύνεται σε cross-context branch target injection.
IBRS / eIBRSΌχιΠεριορίζει prediction ανά privilege level — το BTR είναι intra-context.
IBPB (context-switch flush)ΌχιΤο stale entry επιβιώνει μέσα στο ίδιο context· δεν υπάρχει switch να το καθαρίσει.
KPTI (page-table isolation)ΌχιΛύνει άλλη κατηγορία (Meltdown-style)· δεν αγγίζει δομές πρόβλεψης.
JIT hardening (constant blinding κ.λπ.)ΜερικώςΔυσκολεύει τη χρήση του primitive (χειρότερα gadgets), όχι τη δημιουργία του.
W^XΌχιΟρθογώνιο: δεν λέει τίποτα για το τι θυμάται το BTB.
Απενεργοποίηση unprivileged cBPF JIT (interpreter fallback)Ναι*Κόβει τον αποδεδειγμένο vector, όχι κατ' ανάγκη το φαινόμενο (άλλοι JITs παραμένουν).
Ακύρωση BTB εγγραφών σε overwrite εκτελέσιμης μνήμηςΝαι (αν υπάρξει)Η αρχιτεκτονικά «σωστή» λύση — hardware/µcode συνεργασία, ακόμη ζητούμενο.

* Η αξιολόγηση κάλυψης είναι δική μας, με βάση την περιγραφή του primitive στη δημοσιοποίηση — όχι επίσημη θέση κατασκευαστών (δεν υπήρχε στα δημοσιεύματα της 29/9).

Η βαθύτερη αιτίαΤο λάθος δεν είναι «ένα bug»· είναι η μη-επαναφορά μικροαρχιτεκτονικής κατάστασης όταν αλλάζει το νόημα της μνήμης. Οι CPUs εγγυώνται συνέπεια για τον κώδικα (τι εκτελείται), όχι για τις προβλέψεις που έγιναν γι' αυτόν τον κώδικα πριν από millisecond. Κάθε γενιά επεξεργαστών «σκάβει» όλο και πιο βαθιά στην πρόβλεψη για performance· κάθε φορά που το κάνει, οι δομές πρόβλεψης γίνονται πιο πλούσιες — και πιο «θορυβώδεις» ως προς το τι θυμούνται από κώδικα που πέθανε.

07 //Προσομοιωτής: δες ένα stale entry να γεννιέται — και να «σκοτώνει»

Το μοντέλο που ακολουθεί απλοποιεί το BTR σε 6 εγγραφές BTB και 3 JIT σελίδες. Πείραξε το «JIT churn» (πόσο συχνά ο compiler ξαναγράφει κώδικα), άνοιξε/κλείσε τις άμυνες και πάτησε «Εκτέλεση επίθεσης»: θα δεις βήμα-βήμα πώς μια stale πρόβλεψη οδηγεί — ή δεν οδηγεί — σε speculative διαρροή.

BTR SIM · branch target reuse playground v1.0 · educational model
Branch Target Buffer (BTB)
JIT code pages
Controls
Ρύθμισε τις παραμέτρους και πάτησε «Εκτέλεση επίθεσης».
Εκπαιδευτικό μοντέλο — όχι accurate microarchitectural simulator. Δείχνει τη λογική των stale entries· τα πραγματικά συστήματα έχουν πολλαπλά επίπεδα BTB, ιστορίες πρόβλεψης, ASLR και timing noise. Δεν συνιστά exploit υλικό.

08 //Οδηγός άμυνας ανά ρόλο: τι κάνεις από αύριο

Πριν περάσουμε στις ενέργειες, μια σημείωση ειλικρίνειας: δεν υπάρχει ακόμη επίσημο advisory στα δημοσιεύματα της 29/9. Άρα το παρακάτω δεν είναι «λίστα patches» — είναι μείωση έκθεσης και ετοιμότητα μέχρι να δούμε τις θέσεις των κατασκευαστών και τις ενημερώσεις του οικοσυστήματος.

Για sysadmins & infra teams

Άμεσα
  • Ενημερώσεις OS / kernel / microcode σε προτεραιότητα. Ακόμη κι αν δεν στοχεύουν ειδικά το BTR, κλείνουν τη «γειτονιά» των speculative bugs.
  • Μείωσε την έκθεση του unprivileged cBPF JIT όπου το επιτρέπει το workload — ο αποδεδειγμένος vector περνά από εκεί. Δες τις επιλογές παρακάτω, με δοκιμή πρώτα.
  • Απομόνωσε τα «γειτονικά» workloads: μη τρέχεις μη έμπιστο κώδικα (CI jobs, plugins, containers τρίτων) στο ίδιο μηχάνημα με ευαίσθητα secrets. Ο διαχωρισμός trust-levels είναι φθηνότερος από ένα leak.
# Παράδειγμα περιορισμού (ελέγξτε επιπτώσεις πριν εφαρμόσετε):
# 1) unprivileged BPF εκτός, όπου δεν χρειάζεται
sysctl -w kernel.unprivileged_bpf_disabled=2      # μόνιμα: /etc/sysctl.d/

# 2) cBPF JIT σε interpreter mode (fallback — πιο αργό, λιγότερη επιφάνεια)
sysctl -w net.core.bpf_jit_enable=0

# 3) Έλεγχος τρέχουσας κατάστασης
sysctl kernel.unprivileged_bpf_disabled net.core.bpf_jit_enable
# …και monitoring για αλλαγές σε seccomp profiles / socket filters

Προσοχή: το `bpf_jit_enable=0` ρίχνει τις επιδόσεις των φίλτρων και μπορεί να επηρεάσει εργαλεία που βασίζονται σε BPF. Δοκίμασε σε staging, μέτρα, και τεκμηρίωσε την απόφαση. Επίσης: μην το κάνεις «τυφλά» — κάθε αλλαγή θέλει rollback plan.

Για developers & platform engineers

  • Βάλε τους JITs στη threat model σου. Αν η εφαρμογή σου φιλοξενεί plugins/scripts και JIT-άρει (JVM, JS, Wasm, custom compilers), η επιφάνεια υπάρχει — ακόμη κι αν εσύ «δεν κάνεις κάτι κακό».
  • Κράτα runtimes ενημερωμένα (GraalVM, browser engines, JVM distributions). Τα JIT hardening flags που προσφέρουν (π.χ. constant blinding, randomization) αυξάνουν το κόστος εκμετάλλευσης.
  • Μην συγκατοικούνται secrets με κώδικα τρίτων στην ίδια διεργασία/μηχάνημα. Tenant isolation σε επίπεδο process/VM/host — όχι μόνο sandbox — είναι η σωστή μονάδα για speculative-execution threats.
  • Σχεδίασε για διαρροή «μικρών bits». Τα side channels αυτού του τύπου χτυπάνε μυστικά σε μνήμη· άρα: key rotation, short-lived credentials, secret managers με TTL — υποθέτοντας ότι κάποτε μπορεί να «δουν» τη μνήμη speculatively.

Για security teams & CISO

  • Καταγραφή επιφάνειας: πόσοι hosts/containers τρέχουν μη έμπιστο κώδικα; πόσοι JITs (browsers, JVMs) είναι ενεργοί; που συνυπάρχουν με κρίσιμα credentials;
  • Red-team scenario: «τοπική μη προνομιούχος εκτέλεση → speculative leak credential material». Είναι πιο ρεαλιστικό από memory-corruption exploits και περνάει κάτω από το ραντάρ πολλών EDR.
  • Παρακολούθησε τα advisories: περιμένουμε ανακοινώσεις κατασκευαστών/οικοσυστήματος· κράτα change window και performance regression testing έτοιμα — ιστορικά, οι speculative mitigations κοστίζουν σε απόδοση.
  • Θυμήσου: το seccomp δεν είναι πια «απόλυτο» απέναντι σε speculative leaks — παραμένει ισχυρή άμυνα κατά των non-speculative escapes, αλλά το threat model πρέπει να ενημερωθεί.
Η σύνοψη σε μία γραμμήΛιγότερο unprivileged JIT, περισσότερος διαχωρισμός trust levels, ενημερωμένα συστήματα, και monitoring — μέχρι να μάθουμε τι θα προσφέρει το hardware/µcode για την ακύρωση των stale predictions.

09 //Τι σημαίνει για το μέλλον του hardware

Το BTR είναι, πάνω απ' όλα, ένα μάθημα σχεδίασης: κάθε μικροαρχιτεκτονική δομή που «θυμάται» κάτι περισσότερο από τη λογική ζωή του προγράμματος γίνεται, αργά ή γρήγορα, κανάλι πληροφορίας. Ο branch predictor είναι ακριβώς αυτό: ένας μηχανισμός συμπίεσης ιστορίας — και η ιστορία του περιλαμβάνει πλέον και κώδικα που δεν υπάρχει πια.

Οι κατευθύνσεις που συζητιούνται

  • Ακύρωση των stale predictions στο hardware. Η «σωστή» λύση: όταν μια διεύθυνση εκτελέσιμου κώδικα ξαναγράφεται ή ελευθερώνεται, τα σχετικά branch targets να καθαρίζονται — ιδανικά με µcode/hardware υποστήριξη, όχι με ακριβό software flush σε κάθε JIT event. Είναι η διαφορά ανάμεσα στο «σβήνω το λάθος» και στο «δεν το έκανα ποτέ».
  • Code-version tagging στις δομές πρόβλεψης. Αν οι εγγραφές του BTB «κουβαλούν» ταυτότητα/έκδοση του κώδικα για τον οποίο εκπαιδεύτηκαν, μια stale εγγραφή απλώς δεν κάνει match με τη νέα γενιά — ασχέτως επαναχρησιμοποίησης διευθύνσεων.
  • JIT-side πολιτικές. Ποτέ επαναχρησιμοποίηση ελευθερωμένων code slots, ενίσχυση randomization, interpreter fallback για unprivileged δρόμους (όπως το cBPF) — όλα θυσίες απόδοσης που οι vendors καλούνται να ζυγίσουν.
  • Software-cooperative hints. «Συνεργασία» compiler/runtime → πυρήνας → hardware: ρητό σήμα «αυτή η περιοχή κώδικα πέθανε». Λογικό, αλλά απαιτεί πρότυπα και υιοθέτηση χρόνων.

Και η σχέση με το CHERI;

Στο αφιέρωμά μας για το CHERI και το seL4 είδαμε πώς η capability-based αρχιτεκτονική εξαφανίζει ολόκληρες κατηγορίες memory-corruption exploits σε επίπεδο hardware. Σημαντική διευκρίνιση: το CHERI δεν λύνει τα speculative side channels — είναι ορθογώνιο. Το μάθημα δεν είναι «όλα με ένα chip», αλλά ότι η ασφάλεια χτίζεται πλέον co-design hardware-software: δικαιώματα στη μνήμη (CHERI) για τα pointers, «υγιεινή» στις δομές πρόβλεψης για τη speculation. Όποιος περιμένει ένα memcpy-patch hero για το BTR, θα απογοητευτεί· εδώ το fix είναι αρχιτεκτονικό.

Το μοτίβο που επαναλαμβάνεται2018: Spectre. 2022: BHI. 2026: BTR. Σε κάθε κύκλο, η απειλή δεν είναι «ένα bug» αλλά μια ιδιότητα: κατάσταση που επιβιώνει πέρα από τη λογική της ζωή. Τα επόμενα χρόνια, το ίδιο ερώτημα θα τεθεί για return address predictors, prefetchers, caches με μνήμη ιστορίας — κάθε δομή απόδοσης είναι, εκ των προτέρων, υποψήφιο κανάλι.

10 //Χρονολόγιο: από το Spectre του 2018 στο BTR του 2026

Ιανουάριος 2018

Spectre v2 (CVE-2017-5715) βγαίνει στο φως

Branch target injection: η speculation αποδεικνύεται επικοινωνιακό κανάλι. Ακολουθεί η εποχή των retpoline, IBRS, IBPB — και μια δεκαετία microcode updates.

2022

BHI — το eIBRS «πέφτει»

Η έρευνα δείχνει ότι η ιστορία πρόβλεψης μπορεί να δηλητηριαστεί ακόμη κι όταν η κλασική δηλητηρίαση φράσσεται. Το μοτίβο «κάθε mitigation γεννά την επόμενη παραλλαγή» παγιώνεται.

29 Σεπτεμβρίου 2026

BTR: Branch Target Reuse (VUSec + Scuola Superiore Sant'Anna)

Stale indirect branch predictions στους JIT compilers· speculative execute-after-free· δύο end-to-end exploits στον πυρήνα Linux μέσω cBPF που διαρρέουν root password hash σε σύγχρονους Intel. CPUs: Intel, AMD, Arm. Πλήρες browser exploit: «εφικτό» αλλά όχι έτοιμο. Χωρίς CVE/advisory στα δημοσιεύματα.

Επόμενο ορόσημο →

Advisories & mitigations (εκκρεμεί)

Αναμένουμε θέσεις κατασκευαστών και οικοσυστήματος (microcode, OS, JIT policies). Μέχρι τότε: μείωση έκθεσης, διαχωρισμός trust levels, monitoring — όσα περιγράψαμε στον οδηγό άμυνας.

11 //Συχνές ερωτήσεις

Είναι το BTR το ίδιο με το Spectre v2 του 2018;
Όχι. Το κλασικό Spectre v2 (branch target injection) απαιτεί cross-context mistraining: ο επιτιθέμενος δηλητηριάζει τον branch predictor από το δικό του context για να εκτρέψει τα indirect branches του θύματος. Το BTR αξιοποιεί stale (ληγμένες) εγγραφές του BTB που δημιούργησε ο ίδιος ο κώδικας του θύματος — π.χ. ένας JIT compiler — και οι οποίες επιβίωσαν αφού ο κώδικας ξαναγράφτηκε. Είναι ένα «speculative execute-after-free».
Ποιοι επεξεργαστές επηρεάζονται;
Σύμφωνα με τους ερευνητές των VUSec (Vrije Universiteit Amsterdam) και Scuola Superiore Sant'Anna, το BTR επηρεάζει συστήματα με Intel, AMD και Arm CPUs. Στη δημοσιευμένη ανάλυση, τα end-to-end exploits στον πυρήνα Linux που διαρρέουν root password hash περιγράφονται για σύγχρονους Intel επεξεργαστές.
Μπορεί ένα site να με «χακάρει» μέσα από τον browser;
Θεωρητικά ναι — οι ερευνητές αναφέρουν ότι επιθέσεις από κακόβουλες ιστοσελίδες «φαίνονται εφικτές», αλλά δεν έχουν κατασκευάσει ακόμη πλήρες browser exploit. Η ανάλυση κάλυψε τον SpiderMonkey (JavaScript/Wasm engine του Firefox), τον GraalVM της Oracle και τον cBPF JIT του πυρήνα Linux. Αν ωριμάσει PoC, το drive-by σενάριο γίνεται το μεγάλο ερώτημα.
Πιάνουν τα retpoline, IBRS/eIBRS ή το KPTI;
Ουσιαστικά όχι. Οι καθιερωμένες άμυνες κατά του Spectre v2 στοχεύουν το cross-context branch target injection. Το BTR δεν χρειάζεται κάτι τέτοιο: οι stale εγγραφές δημιουργούνται μέσα στο ίδιο execution context από τη ροή του JIT. Χρειάζονται άμυνες που ακυρώνουν τα stale targets όταν εκτελέσιμη μνήμη ξαναγράφεται/ελευθερώνεται — ή αποκλεισμός των επιφανειών του JIT (π.χ. unprivileged cBPF). Δες τον σχετικό πίνακα κάλυψης.
Τι μπορώ να κάνω σήμερα;
Ενημερώσεις OS/kernel/microcode και παρακολούθηση advisory των κατασκευαστών· περιορισμός του unprivileged cBPF JIT όπου είναι εφικτό (kernel.unprivileged_bpf_disabled / net.core.bpf_jit_enable=0, με δοκιμή επιπτώσεων)· αυστηρή απομόνωση multi-tenant hosts και CI runners όπου τρέχει μη έμπιστος κώδικας· καταγραφή ύποπτης χρήσης seccomp/socket filters. Ο πλήρης οδηγός ανά ρόλο είναι πιο πάνω.

12 //Πηγές, μεθοδολογία & σημειώσεις

  • SecurityWeek — «New Spectre v2 Variant Exposes Intel, AMD, Arm CPUs to Data Leaks» (Eduard Kovacs, 29 Σεπτεμβρίου 2026): η κύρια βάση της τεχνικής περιγραφής (BTR, stale indirect branch prediction entries, speculative execute-after-free, ανάλυση σε Linux cBPF / GraalVM / SpiderMonkey, δύο end-to-end exploits, διαρροή root password hash σε σύγχρονους Intel).
  • VUSec group (Vrije Universiteit Amsterdam) & Scuola Superiore Sant'Anna — οι ερευνητικές ομάδες πίσω από τη δημοσιοποίηση· τα αποσπάσματα-δηλώσεις στο άρθρο προέρχονται από τη δημόσια περιγραφή τους, όπως μεταφέρθηκε στην κάλυψη.
  • Ιστορικό πλαίσιο: Spectre v2 (CVE-2017-5715, 2018) και BHI (Branch History Injection, 2022) — δημόσια τεκμηριωμένα ορόσημα της ίδιας κατηγορίας.
  • Μεθοδολογία/όρια: όπου η δημοσιοποίηση δεν αναφέρει κάτι ρητά (CVE, advisory κατασκευαστών, PoC, χρόνοι διαρροής), το σημειώνουμε ως εκκρεμές — δεν το συμπληρώνουμε εμείς. Οι πίνακες κάλυψης αμυνών είναι αξιολόγηση της σύνταξης με βάση το περιγραφόμενο primitive, όχι επίσημη θέση vendors.
  • Ημερομηνία λήψης δεδομένων: 30 Σεπτεμβρίου 2026. Επειδή πρόκειται για ενεργή ιστορία (advisories/mitigations αναμένονται), έλεγχε πάντα τις τελευταίες ενημερώσεις των κατασκευαστών πριν πάρεις αποφάσεις.
Σχετικά άρθρα στο blogΘέλουμε το deep dive να είναι αφετηρία, όχι μονόλογος. Δες τα παρακάτω για το ευρύτερο πλαίσιο.