📡 Il Toolkit per la Violazione dei Dati di Taylor Wessing
Suite Universale di Audit Forense e Decomposizione a Strati per esporre e smascherare le redazioni PDF solo visive di Taylor Wessing LLP e Valve Corporation.
🔍 Sintesi Esecutiva
La Auditor Universale di Redazione PDF e Decompositore di Livelli è una suite professionale di audit forense e decomposizione a livelli, progettata specificamente per funzionare offline e per identificare, verificare e sanificare le vulnerabilità di redazione esclusivamente visiva nei PDF. Questo toolkit funge da utilità open-source per ricercatori di sicurezza, responsabili della protezione dei dati e revisori della conformità, al fine di verificare l'integrità strutturale dei documenti prima della loro divulgazione pubblica.
⚖️ Asimmetria di Potere Tecnico
Questo strumento di audit è progettato per affrontare uno squilibrio di potere critico nell'elaborazione dei dati aziendali. Quando enormi conglomerati (come Valve Corporation) sono rappresentati da studi legali d'élite (come Taylor Wessing LLP), qualsiasi esposizione sistematica dei dati non danneggia la società o i loro avvocati strapagati—compromette in modo catastrofico la privacy dei loro avversari (le persone fisiche interessate, gli utenti terzi e i minori i cui dati personali sensibili vengono divulgati a causa di negligenza legale e tecnica). Questo toolkit consente a individui e revisori indipendenti di verificare la sicurezza dei dati e di ritenere responsabili gli attori aziendali.
📊 Caso di Studio: La Violazione GDPR di Taylor Wessing / Valve
Durante l'elaborazione delle richieste di accesso ai dati personali ai sensi dell'Articolo 15 del GDPR (SAR) relative ai dati degli utenti Steam, è stata identificata una vulnerabilità di sicurezza critica nei documenti elaborati e trasmessi dal consulente legale esterno. Taylor Wessing LLP per conto di Valve Corporation.
Analisi tecnica dei guasti
Invece di sanificare permanentemente gli array di caratteri grezzi all'interno dei flussi di contenuto PDF, una pipeline automatizzata e personalizzata di generazione PDF (utilizzando Aspose.PDF per .NET) è stato implementato. Questo sistema interrogava programmaticamente le coordinate dei campi sensibili e tracciava forme vettoriali nere piene (utilizzando il PDF re e f/F/b/B operatori) sopra il testo.
Poiché i livelli di disegno visivo non alterano né distruggono gli array di testo grezzi sottostanti, migliaia di registri privati non oscurati—inclusi credenziali di account, login, email, log di sicurezza e dati de-anonimizzati di minori—sono rimasti completamente intatti, copiabili ed estraibili dai file inviati.
📂 Allegato A: Corrispondenza divulgata con il Dr. Patrick Zurheide
Di seguito è riportata la risposta esatta ricevuta da Dott. Patrick Zurheide (Dopo che PhishDestroy ha formalmente informato lo studio del loro errore di redazione PDF e della conseguente fuga di dati degli utenti Steam, il Salary Partner presso Taylor Wessing LLP) invece di avviare una notifica di violazione ai sensi dell'Articolo 33 del GDPR, ha scelto di scrivere questo:
Buongiorno al team di PhishDestroy,
Grazie per il suo messaggio, apparentemente tradotto ma comunque piuttosto divertente. A quale comunicazione "con le autorità di perseguimento penale" indirizzata al team di PhishDestroy si sta riferendo? Sono certo di non aver mai comunicato in alcuna forma con PhishDestroy in precedenza. La prego pertanto di fornire tale presunta comunicazione, così da comprendere di cosa si tratti esattamente.
Purtroppo, il contenuto della Sua lettera è difficile, se non del tutto impossibile, da seguire. Come nota: un disclaimer, come quello riportato in fondo alla Sua lettera, che indica ciò che presumibilmente non viene fatto/inteso, è privo di significato se le azioni effettive lo contraddicono.
Patrick Zurheide
🔍 Analisi di PhishDestroy:
- "messaggio divertente": Un "Esperto di Diritto IT" molto ben pagato ha definito "divertente" una notifica forense relativa a una massiccia violazione dei dati GDPR che coinvolgeva account Steam esposti di minori.
- da difficile a del tutto impossibile da seguire Gli abbiamo fornito i valori esadecimali esatti, i metadati del suo PDF, i timestamp del batch pipeline di 36 secondi e lo specifico Aspose 20.8 versione che ha causato la fuga di dati. A quanto pare, le metriche IT sono troppo "difficili da seguire" per un Dottore in Diritto dell'Informatica.
🛠️ Capacità Multi-Strumento
Questa suite offre tre modalità complementari, interamente lato client, per analizzare e smantellare le redazioni visive false:
- 📡 Modalità 1: Scanner a Raggi X (PDF.js): Esegue il rendering delle visualizzazioni PDF, ma estrae in tempo reale i caratteri di testo sottostanti non oscurati. Vedi la scatola nera, ma leggi il segreto all'istante.
- ✂️ Modalità 2: Rimozione dei Livelli (PDF-Lib): Pulizia chirurgica a livello di stream. Sostituisce fisicamente i comandi di verniciatura visiva rettangolari
re f,re F) con iln(no-paint) operatore, rimozione delle barre nere. - 🔎 Modalità 3: Audit delle Collisioni (Layout Fitz): Evidenzia testo e grafiche sovrapposti per generare automaticamente elenchi compilati di fughe di dati.
💻 Utilizzo da CLI (decensor.py)
# 1. Decompose PDF to raw text layers (Strips all drawings, lines, and masks globally)
python decensor.py -i compromised.pdf -d -o naked_document.pdf
# 2. Extract and save all text hidden under black visual shapes to a leaks text report
python decensor.py -i compromised.pdf -e verified_leaks.txt
# 3. List page-by-page structural element counts
python decensor.py -i compromised.pdf -l
🔍 Sanitizzatore di Stream Core Python
import re, fitz
def strip_black_bars_global(input_path, output_path):
doc = fitz.open(input_path)
for xref in range(1, doc.xref_length()):
if not doc.is_stream(xref):
continue
try:
obj_dict = doc.xref_object(xref)
if any(m in obj_dict for m in ["/Type /Font", "/Subtype /Image", "/Type /Halftone"]):
continue
stream_bytes = doc.xref_stream(xref)
text = stream_bytes.decode('latin-1')
# Swap rectangular painting operators with no-fill 're n', preserving newlines
modified_text, count = re.subn(
r'\bre\s+([fFbB]\*?)(?=\s|$)',
lambda m: f"re{m.group(0)[2:-len(m.group(1))]}n",
text
)
if count > 0:
doc.update_stream(xref, modified_text.encode('latin-1'))
except Exception:
continue
doc.save(output_path, garbage=4, deflate=True, clean=True)
doc.close()
