לעשות fingerprinting לטקסט

שיטה נאה, מבוססת ג׳אווהסקריפט, לדעת מי העתיק את הטקסטים שלכם.
כיתוב: WEB

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

ארגונים וחברות, במיוחד חברות אפלוליות שהאתיקה היא לא נר לרגלן (אהם אהם פייסבוק, אני מסתכל עליכם) לא אוהבים את זה. וזו הסיבה שהם מנסים למצוא את העובד ש"סרח". אבל איך מוצאים אותו? דרך הטקסט שהוא העתיק! ישנן דרכים רבות לשייך טקסט לאדם שהעתיק אותו ויש חברות שממש מתמחות בכך. במאמר הזה אני אציג דרך שלפי דעתי היא חכמה במיוחד. המאמר כולו מתבסס על הטכניקה של חוקר האבטחה 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 ודרך הכלים שהזכרתי לעיל על מנת לראות שאין תוים מוחבאים, מיחקו את כל המקפים השונים (וכמובן לשנות את הפונט או להסירו לחלוטין). אם אתם עיתונאים, השתדלו ככל האפשר שלא לפרסם את הטקסטים המקוריים או לפרסמם באופן חלקי לאחר עיבוד גרפי כבד שיטשטש חלק מהפרטים.

פוסטים נוספים שכדאי לקרוא

תמונה מצוירת של רובוט שמנקה HTML
יסודות בתכנות

סניטציה – למה זה חשוב

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

רספברי פיי

מה זה AIoT? ואיך אפשר להתחיל?

פוסט עם המון קישורים, מידע, סרטונים ופרק בפודקאסט שיפתח לכם שער לעולם ה-AIoT המרתק.

גלילה לראש העמוד