Sentinel
Sentinel קמה עם חזון אחד: שאף אחד לא יצולם בלי לדעת. נכנסים לחדר במלון או בדירה, לוחצים פעם אחת, והאפליקציה סורקת את רשת ה-Wi-Fi, את מכשירי הבלוטות׳ שמסביב ואת החדר עצמו דרך המצלמה, ומראה בדיוק איזה מכשיר חשוד ולמה.
9 פרקים · ~9 דק׳ קריאה
מצלמות נסתרות מסתתרות בחפצים יומיומיים: גלאי עשן, שעון, מטען, נורה. Sentinel נבנתה למטיילים ולאורחים בדירות נופש, כדי שיוכלו לבדוק חדר תוך שניות. האפליקציה משלבת שלוש שיטות זיהוי שונות, מסבירה כל חשד בשפה פשוטה, ובמקרים רבים מאפשרת לפתוח את השידור של המצלמה שנמצאה ולראות לאן היא מכוונת. הכל רץ על הטלפון, ושום מידע לא יוצא ממנו.
בניתי את האפליקציה מקצה לקצה ב-Swift נייטיבי: מנוע סריקת הרשת, זיהוי הפרוטוקולים, סורק האינפרה אדום, החיבור לשידורי מצלמות, העיצוב, וכמעט 370 בדיקות אוטומטיות.
סריקת הרשת בלחיצה אחת
כל מכשיר שמחובר ל-Wi-Fi, גם אלה שמנסים לא להיראות
המשתמש לוחץ על כפתור אחד, והאפליקציה עוברת על כל הכתובות ברשת שהוא מחובר אליה, מוצאת כל מכשיר פעיל ומנסה להבין מה הוא. מצלמה שמחוברת לאותו Wi-Fi לא יכולה להסתתר, גם אם היא לא מפרסמת את עצמה.

הסריקה משלבת כמה שיטות במקביל, כי כל מצלמה מתגלה בדרך אחרת. פינג לכל הכתובות מוצא גם מצלמות ענן שלא פותחות אף פורט. שאילתות גילוי שמצלמות עונות להן (ONVIF, UPnP, ופרוטוקול ה-P2P של מצלמות המיני הזולות) חושפות אותן גם כשהן שקטות. והשמות שמכשירים מפרסמים ברשת, כולל שמות מערכת של קושחות מצלמה, משלימים את התמונה.
סריקה בשכבות, בלי להעמיס על הרשת
במקום לסרוק את כל 65 אלף הפורטים בכל מכשיר, הסריקה מתחילה מרשימה קצרה של הפורטים הנפוצים אצל מצלמות, ומעמיקה רק במכשירים שנשארו לא מוסברים. מכשירים קטנים וחלשים מקבלים קצב איטי יותר ופינג "השכמה" לפני כל סבב, כי מצלמות במצב חיסכון בחשמל פשוט מפספסות חבילות. כך סריקה של רשת שלמה נגמרת תוך שניות, בלי להפיל אף מכשיר.
זיהוי מצלמה לפי מה שהיא אומרת, לא לפי הפורט
הלקח הכי חשוב מבדיקות השטח
הרבה אפליקציות מחפשות "פורט של מצלמה" ומסיקות שיש מצלמה. בבדיקות מול מצלמות נסתרות אמיתיות גיליתי שזה פשוט לא עובד, אז Sentinel מדברת עם כל מכשיר ומזהה אותו לפי התשובות שלו.

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

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

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

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

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

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

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