آینه ضد سانسور و ابزار امنیتی

📡 مجموعه ابزارهای نقض داده تیلور وِسینگ

سوییت جامع ممیزی جنایی و تجزیه لایه‌ها برای آشکارسازی و شناسایی ویرایش‌های بصری‌محور در فایل‌های PDF توسط شرکت‌های Taylor Wessing LLP و Valve Corporation

مقاومت در برابر سانسور

این مجموعه ابزار و مطالعات موردی مرتبط با آن به‌طور دائمی در این‌جا آینه‌سازی شده‌اند. هرگونه تهدید حقوقی، درخواست حذف بر اساس DMCA، یا تلاش‌های بازدارنده از سوی تیلور wesینگ LLP یا شرکت والو به‌عنوان اثبات عمومی و غیرقابل انکاری از تلاش برای سانسور پژوهش‌های امنیتی و پنهان‌کاری در برابر ناکارآمدی فنی تلقی خواهد شد.

Forensic PDF analysis
ممیزی پیشینه‌ای فایل PDF: بازسازی و بررسی لایه‌های ترسیم اسناد برای حذف پوشش‌های برداری جعلیِ جعبه‌سیاه و استخراج متن خام و بدون سانسور.

🔍 خلاصه مدیریتی

این ممیز و تجزیه‌کننده لایه‌های عمومی PDF یک مجموعه حرفه‌ای با اولویت کارکرد آفلاین برای ممیزی جنایی و تجزیه لایه‌ها است که به‌طور اختصاصی برای شناسایی، اعتبارسنجی و پاک‌سازی آسیب‌پذیری‌های ویرایش (Redaction) صرفاً بصری در فایل‌های PDF طراحی شده است. این ابزارکیت به‌عنوان یک tiệnیت متن‌باز برای پژوهشگران امنیت، افسران حفاظت از داده و ممیزان انطباق عمل می‌کند تا یکپارچگی ساختاری اسناد را پیش از افشای عمومی تأیید کنند.

⚖️ عدم تقارن قدرت فنی

این ابزار ممیزی برای برطرف‌سازی یک عدم تعادل حیاتی در قدرت در فرآیند پردازش داده‌های شرکتی طراحی شده است. زمانی که کنسرسیوم‌های عظیم (مانند شرکت والو) توسط شرکت‌های حقوقی برتر (مانند تیلور wesینگ LLP)، هرگونه افشای سیستماتیک داده‌ها نه به شرکت و نه به وکلای پرهزینه‌اش آسیب می‌زند، بلکه حریم خصوصی آن‌ها را مخالفان (افراد داده‌ای، کاربران شخص ثالث و قاصرانی که داده‌های شخصی حساس آن‌ها به دلیل بی‌احتیاطی‌های حقوقی و فنی نشت می‌کنند). این مجموعه ابزار، افراد و ممیزان مستقل را توانمند می‌سازد تا ایمنی داده‌ها را تأیید کنند و مسئولیت‌پذیری بازیگران سازمانی را تضمین نمایند.

📊 مطالعه موردی: نشت داده‌های GDPR در تیلور وِسینگ / ولو

در جریان پردازش درخواست‌های دسترسی موضوعی (SAR) بر اساس ماده ۱۵ آیین‌نامه حفاظت داده‌های عمومی (GDPR) مربوط به داده‌های کاربران استیم، یک آسیب‌پذیری امنیتی بحرانی در اسنادی که توسط وکلای خارجی پردازش و ارسال شده بودند، شناسایی شد. تیلور wesینگ LLP به نمایندگی از شرکت والو.

تحلیل خرابی فنی

به‌جای پاکسازی دائمی آرایه‌های خام کاراکترها در جریان‌های محتوای PDF، یک خط لوله تولید PDF سفارشی و خودکار (با استفاده از Aspose.PDF برای .NET) استقرار یافت. این سیستم به‌صورت خودکار مختصات مزارع حساس را پرس‌وجو کرد و شکل‌های برداری سیاه یکدست (با استفاده از PDFها re و f/F/b/B ) عملگرها) در بالای متن.

از آنجا که لایه‌های ترسیم بصری، آرایه‌های متن خام زیرین را تغییر یا تخریب نمی‌کنند، هزاران رکورد خصوصی بدون سانسور — شامل اعتبارنامه‌های حساب‌ها، اطلاعات ورود، ایمیل‌ها، لاگ‌های امنیتی و داده‌های شناسایی‌شده (De-anonymized) از افراد زیر سن قانونی — به‌طور کامل دست‌نخورده، قابل کپی و قابل استخراج از فایل‌های ارسال‌شده باقی ماندند.

📂 پیوست الف: مکاتبات نشت‌شده با دکتر پاتریک زورهاید

در ادامه، پاسخ دقیق دریافت‌شده از دکتر پاتریک زورهاید (شریک حقوقی در شرکت تیلور وِسینگ) پس از آنکه فیش‌دیسترویر رسماً شرکت را از شکست در حذف اطلاعات از فایل‌های PDF و نشت داده‌های کاربران استیم آگاه کرد. به‌جای آغاز فرآیند اعلام نقض داده‌ها مطابق با ماده ۳۳ آیین‌نامه حفاظت داده‌های عمومی (GDPR)، او تصمیم گرفت این متن را بنویسد:

روز بخیر، تیم PhishDestroy،

از پیام شما که به نظر می‌رسد ترجمه شده باشد، اما در عین حال سرگرم‌کننده است، سپاسگزارم. شما دقیقاً به کدام ارتباط «با پیگرد کیفری» با تیم PhishDestroy اشاره دارید؟ من کاملاً مطمئنم که تاکنون به هیچ وجه با PhishDestroy ارتباطی نداشته‌ام. لطفاً این ارتباط ادعاشده را ارائه دهید تا بتوانم درک کنم که موضوع چیست.

متأسفانه از نظر محتوایی، پی بردن به منظور نامه شما بسیار دشوار یا حتی غیرممکن است. به عنوان نکته‌ای: اگر در نامه‌تان (مانند آنچه در پایین آمده) سلب مسئولیتی درج کرده‌اید که ادعا می‌کنید قصد انجام آن را ندارید، اما اقدامات واقعی شما با این ادعا در تضاد است، چنین سلب مسئولیتی بی‌معنا خواهد بود.

پاتریک زورهاید

🔍 تحلیل PhishDestroy:

  • پیام سرگرم‌کننده یک «متخصص حقوق فناوری اطلاعات» با حقوق بسیار بالا، اعلان قضایی مربوط به نشتی گسترده داده‌های GDPR شامل حساب‌های Steam افشا شدهٔ افراد زیر سن قانونی را «جالب» خواند.
  • دنبال کردن آن بسیار دشوار یا حتی غیرممکن است ما مقادیر دقیق هگزادسیمالی، متادیتای فایل PDF او، زمان‌بندی‌های خط لولهٔ دسته‌ای ۳۶ ثانیه‌ای و جزئیات آسپوس ۲۰.۸ نسخه‌ای که باعث نشتی شد. به‌نظر می‌رسد شاخص‌های فناوری اطلاعات برای دکتر حقوق فناوری اطلاعات بیش از حد «دشوار پیگیری» هستند.

🛠️ قابلیت‌های ابزار چندمنظوره

این مجموعه سه حالت مکمل و کاملاً سمت‌کاربری برای تحلیل و خنثی‌سازی پوشش‌های بصری جعلی ارائه می‌دهد:

  • 📡 حالت ۱: اسکنر اشعه ایکس (PDF.js): نمایش بصری PDF را رندر می‌کند، اما در همان لحظه، کاراکترهای متنی زیرین بدون سانسور را استخراج می‌کند. شما جعبه سیاه را می‌بینید، اما فوراً راز را می‌خوانید.
  • ✂️ حالت ۲: لایه‌بردار (PDF-Lib): پاکسازی جراحی در سطح جریان. جایگزینی فیزیکی دستورات نقاشی بصری مستطیلی (re f, re F) همراه با n اپراتور (no-paint)، حذف نوارهای سیاه.
  • 🔎 حالت ۳: ممیزی برخورد (چیدمان فیتز): متن‌ها و گرافیک‌های همپوشانی‌دار را برجسته می‌کند تا فهرست‌های خودکارِ نشت‌های اطلاعاتی را تولید کند.

💻 استفاده از خط فرمان (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

🔍 پاک‌ساز جریان پایتون

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()