התחילו כאן קודם

אם אתם רוצים את הגרסה הקצרה והקלה יותר של הסיפור הזה לפני הניתוח ההנדסי המלא, התחילו עם אודיו הוא לא רק פלט. הוא ערוץ.

TL;DR

  • אבטחה התקפית מתחילה בשאלות, לא בכלים.
  • ב-Citrix וב-VDI, הבעיה האמיתית היא לא המאפיין עצמו, אלא האם מידע עדיין יכול לחצות את הגבול.
  • נתיב האודיו הוא לא חולשה במובן הרגיל; הוא ערוץ תקשורת לגיטימי עם אילוצים מדידים.
  • ה-codec, ולא המודולציה, הפך לצוואר הבקבוק האמיתי.
  • מדידות היו חשובות יותר מאינטואיציה, ותכנונים פשוטים שרדו טוב יותר ממתוחכמים.
  • כתיבת הקוד הייתה החלק הקל; הבנת הערוץ הייתה החלק הקשה.

מבוא

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

בארגונים רבים, אבטחה מתורגמת לרשימת יכולות שצריך לאפשר או לחסום. VDI היא דוגמה טובה. מנהל מערכת יכול לבחור אם העברת קבצים מותרת, אם ה-clipboard חסום, אם כוננים מקומיים ממופים, או אם התקני USB מורשים. במבט ראשון, זו נראית דרך סבירה להעריך את מצב האבטחה. ככל שחוסמים יותר יכולות, משטח התקיפה נראה קטן יותר.

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

השינוי הזה, מחשיבה מבוססת יכולות לחשיבה מבוססת ערוצים, מסמן את אחד ההבדלים העיקריים בין בדיקות חדירה לחשיבה של Red Team או אמולציית יריב. במקום לשאול אם קבצים יכולים להיות מועברים, השאלה הראשונה הופכת להיות האם מנגנון כלשהו עדיין מאפשר למידע לחצות את הגבול. זה אולי נשמע כמו שינוי סמנטי, אבל הוא משנה באופן מהותי גם את ניתוח המערכת וגם את גילוי ההזדמנויות.

סביבות Citrix ממחישות זאת היטב. אפשר לחסום את כל מנגנוני שיתוף הקבצים הנפוצים ועדיין להשאיר ערוצים שחיוניים לתפעול תקין. משתמשים עדיין צריכים לראות את שולחן העבודה המרוחק, לשמוע התראות ולהזין קלט. כל מנגנון משרת מטרה פונקציונלית שונה, אבל מבחינה הנדסית כולם חולקים את אותה תכונה: הם מעבירים מידע מנקודה אחת לנקודה אחרת.

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

חשוב להדגיש שהמאמר הזה לא עוסק בחולשה של Citrix ולא מציג “פריצה” במובן המקובל. ערוץ האודיו מתנהג כפי שתוכנן ואינו מסתמך על מימוש פגום. המחקר לא עוסק בעקיפת אבטחה דרך באג. במקום זאת, הוא בוחן כיצד נתיב לגיטימי יכול להיות מנותח כערוץ תקשורת עם מאפיינים הנדסיים מוגדרים. ההבחנה הזו חשובה כי היא מדגישה את ההבדל בין ניצול חולשות למינוף תכונות מערכת מובנות.

זו נקודת המוצא של המחקר המתואר במאמר זה.

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

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

זהו גם המסר המרכזי של המאמר. למרות שבסופו של דבר הוא מציג מערכת תקשורת שפועלת מעל נתיב האודיו של Citrix, הוא לא רק על אודיו. הוא על שינוי התפיסה שמוביל תוקף להפסיק להתבונן ברכיבי מערכת כפונקציונליות מבודדת ולהתחיל להתבונן בהם כערוצי תקשורת מדידים עם אילוצים פיזיים.

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

סצנה מפוצלת שבה בקרות הגנתיות חוסמות נתיבי העברה נפוצים בזמן שתוקף משתמש באודיו כערוץ תקשורת
איור 1 - חסימת מאפיינים לא תמיד חוסמת ערוצים

פירוק הבעיה

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

בכל מערכת תקשורת, יש שאלה יסודית שחייבת להיענות לפני כמעט כל החלטה הנדסית אחרת: מהו טיב הערוץ שעומד לרשותי?

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

זהו גם המקום שבו אני רואה מחקרים רבים שמתחילים בכיוון ההפוך. לעיתים קרובות שיטת מודולציה נבחרת קודם, proof of concept נבנה, ורק אז בודקים אם השיטה בכלל מתאימה לערוץ. מבחינתי, זה הפוך. מודולציה היא פתרון לבעיה הנדסית; היא לא נקודת ההתחלה.

אז לפני שכתבתי שורת קוד אחת, ניסיתי להבין מה באמת נע בין שני הצדדים של גבול ה-VDI.

בשלב הזה, סביבת ה-Citrix עצמה הייתה כמעט משנית. תקשורת הייתה המוקד העיקרי.

אם מסתכלים על נתיב האודיו באופן מופשט, הוא פשוט מנגנון שמעביר גל מנקודה אחת לאחרת. מנקודת מבט פיזית, אין הבדל מהותי בין גל רדיו, Wi-Fi, Bluetooth, או צליל. בכל המקרים, אנרגיה מועברת לאורך זמן, והשאלה היחידה היא כיצד לגרום לשינויים באנרגיה הזו לייצג מידע. זהו, במהותו, ההגדרה של מערכת תקשורת.

המידע עצמו חסר משמעות עבור הערוץ. הערוץ לא יודע אם אנחנו מנסים לשלוח מסמך Word, קובץ ZIP, תמונה, או וידאו. עבור הערוץ, הכול מצטמצם לזרם ביטים. זה אומר שהבעיה האמיתית היא לא איך להעביר קובץ, אלא איך למפות ביטים לשינויים פיזיים שניתן ליצור, לשדר, ולזהות באופן אמין בצד המקבל.

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

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

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

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

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

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

הערת אזהרה: הפרק הבא צפוף מאוד. אם אתם לא רוצים לצלול לפיזיקה שמאחורי התהליך, אתם יכולים לדלג על פרק הפיזיקה.

הבנת הפיזיקה לפני כתיבת קוד

לפני שנוכל להבין איך להעביר מידע דרך קול, צריך להתחיל בעיקרון יותר בסיסי: מידע לא “נע” בעצמו. הוא תמיד מיוצג דרך שינוי בתופעה פיזית כלשהי.

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

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

מהו גל?

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

כשרמקול מנגן מוזיקה, הוא לא “שולח אוויר” למאזין. ממברנת הרמקול נעה קדימה ואחורה, ויוצרת שינויי לחץ מחזוריים באוויר. כל מולקולת אוויר נעה מעט סביב מיקומה המקומי, מעבירה אנרגיה למולקולות שכנות, וחוזרת כמעט לאותו מקום. התוצאה היא גל קול שמתפשט במרחב.

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

שלוש התכונות הבסיסיות של כל גל

לכל גל מחזורי יש שלוש תכונות בסיסיות שניתן לשלוט בהן:

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

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

The Anatomy of a Wave

Amplitude, frequency and phase describe the signal.

Learning note: This visualization is an abstraction of the core terms. It simplifies the model on purpose, but real mastery of waves requires many more concepts, definitions, and edge cases than what is shown here.
Animated sine wave An animated sine wave demonstrating amplitude, frequency and phase. Time Amplitude Amplitude Amplitude One cycle Phase

איך גל נושא מידע?

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

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

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

כמות המידע שמיוצגת על ידי כל סימבול תלויה בכמה מצבים המקלט יכול להבחין ביניהם באופן אמין. עם שני מצבים, כל סימבול נושא ביט אחד. עם ארבעה מצבים שניתן להבחין ביניהם, כל סימבול נושא שני ביטים. שישה עשר מצבים נושאים ארבעה ביטים. באופן כללי, אם יש $M$ מצבים אפשריים, מספר הביטים לסימבול הוא log2(M).

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

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

Codec

Codec הוא מנגנון שמקודד ומפענח אות דיגיטלי, בדרך כלל כדי להתאים אותו לשידור או אחסון. המונח codec מגיע מצירוף של encoder ו-decoder. בצד המשדר, ה-codec מקבל אות, מעבד אותו, ומייצר ייצוג מכווץ או מותאם לערוץ. בצד המקלט, הוא מבצע את התהליך ההפוך ומנסה לשחזר את האות המקורי.

באודיו, codec עשוי להפחית מידע על ידי הסרה או קירוב של פרטים שנחשבים פחות חשובים לשמיעה אנושית. Codec ללא אובדן מאפשר שחזור מדויק של המידע המקורי, בעוד codec עם אובדן מקריב מידע מסוים כדי להפחית את קצב הנתונים הנדרש.

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

רעש

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

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

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

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

המחשה של תקשורת באמצעות גלים עבור הסעיף הנוכחי
איור 2 - תמיכה חזותית למודל תקשורת הגלים

הגיע הזמן להפסיק לנחש

אחת הטעויות הנפוצות ביותר בפרויקטים הנדסיים באופן כללי, ובמחקר אבטחה התקפית בפרט, היא הנטייה להתחיל לבנות מוקדם מדי. קל לבחור שיטת מודולציה שנשמעת מבטיחה, לבנות proof of concept, ולהתחיל לבצע אופטימיזציה. הבעיה בגישה הזו היא שהיא מניחה שהערוץ יתנהג כפי שאנו מצפים.

במקרה של ערוץ אודיו, זו הנחה מסוכנת.

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

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

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

  • אילו תדרים עוברים באופן אמין דרך כל שרשרת התקשורת?
  • האם אמפליטודת האות נשמרת, או שהיא נסחפת לאורך הנתיב?
  • האם הפאזה נשמרת באופן עקבי, או שהעיבוד משנה אותה?
  • האם יש תחומי תדר שבהם ה-codec מדרדר באופן משמעותי את איכות האות?
  • מהו משך הסימבול הקצר ביותר שניתן לשדר לפני שה-codec מורח אותו בזמן?
  • האם ערוצי הסטריאו נשמרים כערוצים עצמאיים, או שהם מתערבבים במהלך הדחיסה?
  • בפועל, איזה קצב נתונים ניתן להשיג מבלי להקריב אמינות?

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

בנקודה הזו, הפסקתי גם להסתכל על Citrix כמוצר. עבורי, Citrix היה רק שלב אחד בשרשרת עיבוד ארוכה. האות לא נסע ישירות מרמקול למקלט. בדרך, הוא עבר דרך מערכת ההפעלה, מערכת המשנה של אודיו ב-Citrix, ה-codec הדחיסה, פרוטוקול התעבורה, התקן הקצה, מערכת המשנה של אודיו המקומית, ולבסוף שלב ההקלטה דרך WASAPI. כל אחד מהרכיבים האלה יכול לשנות, להנחית, או להשמיט מידע מהאות.

האתגר האמיתי לא היה לייצר גל קול. האתגר האמיתי היה להבין אילו תכונות גל שורדות את כל הנתיב.

זו הפכה לנקודת ההתחלה של סדרת הניסויים.

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

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

רק אחרי שהערוץ אופיין מספיק ניתן היה לתכנן את מערכת התקשורת עצמה.

Attacker Channel-First Decision Flow A flowchart showing how an attacker moves from an objective, through channel discovery, characterization and measurement, to system design and implementation. ATTACKER THINKING The Channel Comes Before the Code Start with the objective. Let the channel shape the implementation. 01 Define the objective Move information across a controlled boundary. Do not choose the technique yet. Is there a channel? What still crosses the boundary? NO Look again Stop thinking in features Reframe the problem YES 02 Characterize the channel Identify what the channel preserves, distorts or removes. 03 Measure instead of assuming Frequency · amplitude · phase · noise Symbol duration · codec behaviour · stereo 04 Design around the constraints Choose modulation, framing, error correction and recovery based on measured behaviour. 05 · LAST Write the code

ואז... הכול נשבר

אחרי כמה ימים של קריאה, הבנת מושגי הליבה, ובניית מודל מנטלי של הערוץ, הרגשתי שסוף סוף אני מוכן להתחיל.

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

בפועל, כמעט כל ההנחות הראשוניות שלי התבררו כחלקיות, ולפעמים פשוט שגויות.

בדיעבד, זהו השלב החשוב ביותר בכל המחקר.

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

יותר מורכב = יותר טוב

זו הייתה כנראה ההנחה הראשונה שנשברה.

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

מעבר ניסיוני מהנחות תיאורטיות להתנהגות ערוץ נמדדת
איור 3 - התיאוריה נשברת, המדידה מתחילה

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

עובדה 01

המודולציה הטובה ביותר אינה זו שנושאת הכי הרבה מידע, אלא זו ששורדת את הערוץ הכי טוב.

הערוץ מחליט. לא אתה.

בהתחלה, הייתי משוכנע שאני יכול לבחור כל שיטת מודולציה שאני רוצה, וכל מה שיישאר הוא לממש אותה. בפועל, כמעט כל החלטה התקבלה בשבילי:

  • הערוץ החליט אילו תדרים שורדים.
  • ה-codec החליט אילו מאפייני אות נשמרים.
  • הרעש החליט כמה מצבים ניתן באמת להבחין ביניהם.

עובדה 02

לא אני בחרתי את הארכיטקטורה. הערוץ בחר אותה בשבילי.

אילוצי ארכיטקטורה מונחי-ערוץ בפועל
איור 4 - הערוץ מכתיב את בחירות הארכיטקטורה

מדידה מנצחת אינטואיציה

בשלב הזה, כבר הבנתי משהו חשוב יותר מכל נוסחה שקראתי. כמעט כל החלטה שניסיתי לקבל מאינטואיציה התבררה כשגויה.

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

אפילו סכמת מודולציה שנראתה “נחותה” בתיאוריה לפעמים העבירה יותר מידע, פשוט כי היא שרדה את הערוץ טוב יותר.

מנקודה זו ואילך, הפסקתי לשאול “מה אמור לעבוד?” והתחלתי לשאול “מה המדידות אומרות?” זה כנראה היה השינוי המשמעותי ביותר בכל המחקר.

עובדה 03

מדידות תמיד עדיפות על אינטואיציה.

שכלול מונחה-מדידה של אסטרטגיית תקשורת הערוץ
איור 5 - מדידה מעל אינטואיציה בתכנון ערוץ

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

VDI Bridge

אחרי תקופה ארוכה של לימוד, ניסויים, מדידות, ותיקוני כיוון, התוצאה כבר לא הייתה רק Proof of Concept שיכול לדחוף אות בודד מצד אחד לצד השני. היא הפכה למערכת תקשורת מלאה.

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

בסופו של דבר, המערכת שנבנתה כללה את כל הרכיבים שהיית מצפה למצוא במערכת תקשורת מודרנית: דחיסה, framing, סנכרון, מודולציה, תיקון שגיאות, interleaving, ולידציה, ושלבי שחזור בצד המקלט. למרות שהמדיום הפיזי היה ערוץ אודיו, תהליך התכנון לא היה שונה מהותית מתכנון כל מערכת תקשורת אחרת.

כמובן, הקוד זמין כאן: https://github.com/danieloz147/VDI-Bridge/

סרטון הדגמה של VDI Bridge
01

Raw data

VDI Bridge accepts arbitrary binary information, including files, clipboard content and short control messages. The audio path carries raw bytes rather than Base64-encoded text.

Input
Arbitrary binary data
Use cases
Files, clipboard and control
VDI Bridge transmission pipeline. Select a stage to inspect the corresponding engineering decision.

מה כדאי לזכור מהמאמר הזה

  • אבטחה התקפית מתחילה בשאלות, לא בכלים.
  • כל מערכת היא אוסף של ערוצי תקשורת.
  • הבנת הפיזיקה חשובה יותר מבחירת האלגוריתם.
  • ה-codec היה צוואר הבקבוק האמיתי, לא המודולציה.
  • מדידות טובות שוות יותר מהנחות טובות.
  • מערכת פשוטה שעובדת טובה ממערכת מתוחכמת שלא שורדת את הערוץ.
  • כמעט כל החלטה הנדסית התקבלה אחרי שניסוי נכשל.
  • כתיבת הקוד הייתה החלק הקל ביותר בפרויקט; ההבנה הייתה הקשה ביותר.

כשאני מסתכל על VDI Bridge היום, אני כבר לא רואה מערכת שמעבירה מידע דרך קול. אני רואה תהליך למידה. המחקר התחיל בשאלה על אודיו, המשיך דרך עולם התקשורת הדיגיטלית, והסתיים בדרך חדשה להסתכל על מערכות. הרמקול היה רק נקודת ההתחלה. התובנה החשובה ביותר הייתה שכל עוד יש דרך להעביר מידע בין שתי נקודות, יש גם דרך להתייחס לזה כערוץ תקשורת. ברגע שמתחילים לחשוב כך, קשה מאוד להסתכל על מערכות בכל דרך אחרת.

מחפשים את הגרסה הקצרה?

מאמר זה הוא הצלילה ההנדסית המלאה. לסקירה הקצרה יותר שמתמקדת בשינוי התפיסה ובלקחים המרכזיים, קראו את אודיו הוא לא רק פלט. הוא ערוץ.