לעשות fingerprinting לטקסט

אחד מהאתגרים הגדולים שעומדים בפני ארגונים הוא לזהות דליפות מידע. מה זאת אומרת? בדרך כלל חברים בארגונים (עובדים) שנתקלים במידע פנימי של הארגון שאם הוא יתפרסם הוא יביך את הארגון ומועניינים לחשוף אותו החוצה. למשל טיוח של שחיתות, עדות לתשלום שוחד, הטרדה מינית של ההנהלה כלפי העובדים וכו’. מה שהעובדים האמיצים האלו עושים הוא בדרך כלל להעתיק את הטקסט שהוא המידע הפנימי ולשלוח לעיתונאי באופן אנונימי. העיתונאי עושה את מלאכתו ומפרסם את הטקסט בעיתון – בפרינט ובאתר. הארגון חוטף על הראש, נפתחת חקירה ומנהלים מפוטרים והעובד האמיץ? נותר במחשכים. יש עובדים שמשתמשים באתרים כמו ‘ויקיליקס’ כדי להדליף כמויות גדולות של מידע.

ארגונים וחברות, במיוחד חברות אפלוליות שהאתיקה היא לא נר לרגלן (אהם אהם פייסבוק, אני מסתכל עליכם) לא אוהבים את זה. וזו הסיבה שהם מנסים למצוא את העובד ש”סרח”. אבל איך מוצאים אותו? דרך הטקסט שהוא העתיק! ישנן דרכים רבות לשייך טקסט לאדם שהעתיק אותו ויש חברות שממש מתמחות בכך. במאמר הזה אני אציג דרך שלפי דעתי היא חכמה במיוחד. המאמר כולו מתבסס על הטכניקה של חוקר האבטחה Tom.

בשנים האחרונות, יוניקוד נכנס חזק לכל מערכת וובית וכמעט כל אתר שהוא תומך ביוניקוד. מאוד טבעי עבורנו כישראלים דוברי עברית או ערבית להכנס לכל אתר, גם אם הוא לא תומך ‘רשמית’ בשפתנו ולהקליד שם בשפה שלנו כאוות נפשנו. כך למשל כתבתי ציוצים בעברית שנים לפני התמיכה ‘הרשמית’ של טוויטר בשפת האם שלי. למה? כיוון שיוניקוד הפכה להיות הסטנדרט. ביוניקוד יש גם תוים יותר מעניינים מעברית, ערבית או קירילית. למשל 😀 – אמוטיקונים מוכרים ביוניקוד כמו כל תו אחר. מאחורי 😐 למשל עומד תו ביוניקוד U+1F610. זה מייצג את התו הזה. ישנן המון אותיות ביוניקוד וסימנים. למשל ניקוד בעברית או בשפות אחרות. הגרשיים ״ הייחודיים לעברית מיוצגים על ידי תו היוניקוד U+05F4. יש המון המון תוי יוניקוד ובכללן גם כאלו שאינם נראים ואמורים לסייע להדפסה. אני אתעכב על שניים מהם.

הראשון הוא Zero-width space – תו שאומר רווח ברוחב אפס. למה צריך כזה דבר? זה מאותת למערכת התצוגה שזה “בסדר” לשבור את הטקסט בנקודה שבה ה-Zero-width space מופיע, אך מדובר עדיין במחרוזת טקסט אחת. זה רלוונטי מאוד במחרוזות טקסט ארוכות מאוד כמו כתובות URL.

השני הוא Zero-width non-joiner – תו שאומר שלא מדובר בהלחמה של מילים. למשל אני יכול לשים אותו ב-deaf‌ly בין dea ל-fly על מנת לסמן למערכת שלא מדובר בהלחמה אלא בתואר הפועל של deaf.

נשמע איזוטרי ולא מעניין, נכון? מה שחשוב הוא שמדובר בתוים לא נראים. כלומר לא יראו אותו כלל. רוצים דוגמה? בטח שאתם רוצים. הנה, כאן הכנסתי את המילה hello ואחריה Zero-width space וגם Zero-width non-joiner.

נראה לכם שאני מקשקש? בדקו את הדמו הבא

See the Pen Need a Zero Width Space on your Clipboard? by Ran Bar-Zik (@barzik) on CodePen.

מתעצלים? הכנתי אפילו סרטון קטן ומטופש.

בסרטון אני מעתיק את הטקסט ומדביק אותו בעורך טקסט שיודע לזהות תוי יוניקוד בלתי נראים. שימו לב שיש שני תוים כאלו.

טוב, לא צריך להיות שרלוק הולמס על מנת להבין מה הצעד הבא. נכון? ניתן ליצור מחרוזת ייחודית משני התוים האלו ולהדביק אותה בסוף הטקסט (או במקום כלשהו באמצע הטקסט). למשל, אם יש לי טקסט שנמצא באתר פנימי של החברה וחשוף אך ורק לעובדים, אני יכול לקחת את שם המשתמש של העובד שבוחן כרגע את האתר ולהמיר אותו למחרוזת בינארית של 0-ו-1. בג’אווהסקריפט זה נראה ככה:


function zeroPad(num) {
  return '00000000'.slice(String(num).length) + num;
}
function textToBinary(username) {
  let answer = username.split('').map(char =>
    zeroPad(char.charCodeAt(0).toString(2))).join(' ');
  return answer;
};

const binaryName = textToBinary('barzik');
console.log(binaryName); // "01100010 01100001 01110010 01111010 01101001 01101011"


השם שלי, barzik, יראה כך: “01100010 01100001 01110010 01111010 01101001 01101011” כל מה שנותר לי לעשות זה לקחת את המחרוזת הזו ולהמיר את ה-0 ל-Zero-width space ואת ה-1 ל-Zero-width non-joiner. יהיה לי מחרוזת ארוכה ביותר של…. תוים ריקים שמייצגים את הזהות של המשתמש. עכשיו אני יכול לשתול את התוים הריקים איפה שבא לי 🙂

הנה דוגמה חיה:

See the Pen string to binary by Ran Bar-Zik (@barzik) on CodePen.

היפוך התהליך הוא גם פשוט יחסית. רק להמיר חזרה את התוים הריקים ל-0 ול-1 ואז לקבל את השם של המשתמש.

איך מתגוננים?

זו רק דוגמה *אחת* למה שאפשר לעשות עם טקסט. ואני שם כסף שלא ידעתם על זה. אבל יש עוד דוגמאות – למשל לשחק עם מקפים (לשנות את הסוג שלהם), לשנות מילים נרדפות ועוד מגוון שיטות. זו פשוט שיטה זולה ופשוטה ביותר. כדי לקחת טקסט ולהעביר אותו הלאה – צריך להעביר אותו תהליך של התממה – כלומר להפשיט אותו ממגוון הדרכים לזהותו. אבל זה קשה.אם אתם מדליפים פוטנציאליים, העבירו את הטקסטים המקוריים דרך notepad ודרך הכלים שהזכרתי לעיל על מנת לראות שאין תוים מוחבאים, מיחקו את כל המקפים השונים (וכמובן לשנות את הפונט או להסירו לחלוטין). אם אתם עיתונאים, השתדלו ככל האפשר שלא לפרסם את הטקסטים המקוריים או לפרסמם באופן חלקי לאחר עיבוד גרפי כבד שיטשטש חלק מהפרטים.

כדאי תמיד להשאר מעודכנים! הרשמו לעדכונים של האתר במייל! - המייל יישלח כל יום ראשון בעשר בבוקר ויכיל אך ורק את המאמרים שהתפרסמו באינטרנט ישראל. ללא ספאם, ללא הצפות, ללא בלגנים. אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂

אהבתם? לא אהבתם? דרגו!

לא אהבתי בכלללא אהבתיבסדראהבתיאהבתי מאוד (11 הצבעות, ממוצע: 4.09 מתוך 5)


יאללה, שתפו :)

אל תשארו מאחור! יש עוד מה ללמוד!

11 comments on “לעשות fingerprinting לטקסט
  1. גיא הגיב:

    כרגיל כתוב מעניין, מוסבר היטב, תענוג
    (לא כותב קוד)

  2. איתי הגיב:

    כרגיל כל כתבה היא בית ספר תענוג לקרוא!

  3. עכבר העיר הגיב:

    זה צירוף מקרים שאתה מפרסם את זה קצת אחרי ״פצצת הוואטסטפ״ האחרונה?
    סרטון של טום סקוט אודותיה: https://www.youtube.com/watch?v=jC4NNUYIIdM

  4. ח. הגיב:

    זהות המדליף תיחשף אם הוא מעביר לצד שלישי את העותק הדיגיטלי של הטקסט.
    אבל אם הוא מדפיס עותק ושולח להדלפה את קובץ המודפס או עותק דיגיטלי (למשל pdf) של ההדפסה, אז אותם תווים סמויים לאמופיעים ולא מתגלים.
    או שיש דרך לגלות גם עותק מודפס, למשל ע”י צורה/תוכן אישי?

    • yeo4 הגיב:

      1. אפשר גם לעשות צילום מסך, ולשלוח.
      2. אפשר גם לעשות מיני תוכנה שמזהה את הטקסט דרך התמונה (שנוצרה מהטקסט) (OCR), וכותבת אותו מחדש (וכך תווים בלתי נראים לא יופיעו).
      אחר כך כל תו שלא במאגר מילים שלה, היא מחליפה אותו בדומה (למשל ‘—’ ב ‘-‘, וכו’).
      אחר כך כותבת את הטקסט בגוגל טרנסלייט ומתרגמת אותו לשלל שפות (אנגלית -> רוסית -> ערבית -> אנגלית). וככה המשמעות נשארת, אך רוב המילים מתחלפות.
      ואחר כך החלפת X מילים רנדומליות מהטקסט למילים בעלי אותה משמעות (שמש חמה)
      וזהו.

    • זיו הגיב:

      הרבה מדפסות מסמנות על גבי ההדפסה את זהות המדפיס.
      ראה למשל פה: https://www.eff.org/pages/list-printers-which-do-or-do-not-display-tracking-dots

    • Nachum37 הגיב:

      ב pdf נשמר הטקסט המקורי. בהדפסה בש/ל אכן, אבל במדפסת צבעונית מודפסות סדרת נקודות בלתי נראות לעין המאמתות את זהותה.

  5. אוא הגיב:

    לא כתבת את השיטה הכי פשוטה .
    להמיר את זה לANSI בNotepad
    ולשמור . ואז כל התווים החבויים נמחקים

    • yeo4 הגיב:

      1. ואז מה עם העברית?
      2. גם בANSI יש תווים בלתי נראים (למשל: 0x00 ו0xFF ו0xFA [כמעט בלתי נראה])

  6. שחר הגיב:

    אמ”לק – גופנים טיפה שונים שכל שינוי מייצג מידע וכך הם מקודדים מידע בתוך טקסט קריא ללא סימנים חבויים.

    חוקרים עובדים עכשיו על שיטה עם כוונות טובות שתחליף בדיוק את זה.
    https://www.bleepingcomputer.com/news/technology/fontcode-technique-can-hide-secret-messages-inside-font-glyphs/
    הכוונה של החוקרים היא טובה, להחליף קוד QR במשהו קריא יותר אבל ישר חשבתי על הכתבה שלך.

  7. שמעון הגיב:

    כתיבה יפה קיבלתי המון ידע

כתיבת תגובה

האימייל לא יוצג באתר.

רישום