Android Packet Filter

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

סקירה כללית על APF

ה-APF מורכב משני רכיבים עיקריים:

  • מפענח ה-APF פועל על חומרה של רשתות (בדרך כלל, ערכת השבבים של ה-Wi-Fi). המפענח של APF מריץ קוד בייט של APF על מנות מידע שמתקבלות בחומרה, ומחליט אם לקבל אותן, להשליך אותן או להשיב עליהן.
  • קוד יצירת התוכנית של APF פועל ב-CPU הראשי. הקוד יוצר ומעדכן תוכניות APF בהתאם למצב הרשת והמכשיר.

שיטות Wi-Fi HAL מאפשרות למסגרת Android להתקין את תוכנית ה-APF bytecode ולקרוא את הדלפקים הנוכחיים. מודול Network Stack Mainline יכול לעדכן את בייטקוד התוכנית של APF בכל שלב בזמן ש-APF פועל.

יש כמה מסנני APF שמוטמעים. לדוגמה, APF כולל מסננים לביטול של סוגי אתרנט אסורים, לסינון של מנות פרסום (RA) של נתב IPv6, לסינון של תנועת מולטיקאסט ושידור אם נעילת המולטיקאסט לא מוחזקת, לביטול של מנות DHCP עבור מארחים אחרים ולביטול של מנות פרוטוקול לפתרון כתובות (ARP) וגילוי שכנים (ND) שלא נדרשו. אם הקושחה תומכת ב-APFv6, ApfFilter היא גם יוצרת כללים למענה לסוגים נפוצים של מנות, שאחרת ידרשו מהמעבד להתעורר כדי להגיב, כמו שאילתות ARP ושאילתות NS. הרשימה המלאה של המסננים מוגדרת בכתובת ApfFilter.

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

גרסה של APF

ברשימה הבאה מתוארת היסטוריית הגרסאות של APF:

  • APFv6: הגרסה הזו, שהושקה ב-Android 15, תומכת בסינון מנות, כוללת מוני נתונים לניפוי באגים ולמדדים ותומכת בהעברת מנות.
  • APFv4: הגרסה הזו הושקה ב-Android 10, והיא תומכת בסינון מנות וכוללת מוני באגים ומדדים.
  • APFv2: הגרסה הזו, שהוצגה ב-Android 7, תומכת בסינון מנות.

שילוב עם APF

ממשקי ה-API של APF בין המפרש של APF לבין החומרה מוגדרים ב-apf_interpreter.h (APFv4, APFv6). קוד הקושחה של ה-Wi-Fi קורא ל-accept_packet() ב-APFv4 או ל-apf_run() ב-APFv6 כדי לקבוע אם צריך להשליך את המנה (ערך החזרה אפס) או להעביר אותה למעבד האפליקציה (ערך החזרה שונה מאפס). אם צריך לשדר חבילת נתונים, הפונקציה apf_run() מחזירה גם אפס כי לא צריך להעביר את חבילת הנתונים למעבד האפליקציה. אם הקושחה תומכת ב-APFv6, היא חייבת להטמיע את ממשקי ה-API‏ apf_allocate_buffer() ו-apf_transmit_buffer(). מפענח ה-APF קורא לשני ממשקי ה-API האלה במהלך הלוגיקה של העברת המנות. ההוראות ב-APF הן באורך משתנה. כל הוראה היא באורך של בייט אחד לפחות. קודי ההוראות של APF מוגדרים ב-apf.h עבור APFv4, ומוטמעים ישירות ב-apf_interpreter.c עבור APFv6.

התכונה 'הגנה מתקדמת מפני פישינג' מסתמכת על זיכרון ייעודי. הזיכרון משמש גם לתוכנית APF עצמה וגם לאחסון נתונים, ואסור למערכת על השבב לנקות את הזיכרון או לכתוב בו נתונים, אלא רק באמצעות שיטות ה-HAL של APF. קוד הבייט של APF משתמש באחסון הנתונים כדי לאחסן מוני חבילות שהתקבלו וחבילות שהושמטו. אפשר לקרוא את האזור הגיאוגרפי לאחסון נתונים מתוך מסגרת Android. ההוראות של APF חסכוניות בזיכרון, אבל כדי למקסם את הפוטנציאל שלהן לחיסכון באנרגיה ולפונקציונליות, צריך כללי סינון מורכבים ודינמיים. המורכבות הזו מחייבת הקצאה של חלק ייעודי בזיכרון של ערכת השבבים. דרישת הזיכרון המינימלית ל-APFv4 היא 1,024 בייטים, ול-APFv6 היא 2,048 בייטים. עם זאת, מומלץ מאוד להקצות 4,096 בייט ל-APFv6 כדי להבטיח ביצועים אופטימליים. צריך לקמפל את המפענח של APF לתוך הקושחה. מפרשי APFv4 ו-APFv6 מותאמים לגודל הקוד. בארכיטקטורת arm32, המהדר של APFv4 הוא בערך 1.8 KB, ואילו המהדר המורכב יותר של APFv6, עם תכונות נוספות (לדוגמה, תמיכה מקורית בסיכום ביקורת וקוד מקורי לביטול דחיסה של DNS), הוא בערך 4 KB.

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

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

דוגמאות לתוכניות APF

ApfTest and ApfFilterTest contain sample test programs that illustrate how each APF filter works. כדי לבדוק את התוכנית שנוצרה בפועל, משנים את תרחיש הבדיקה כדי להדפיס את התוכנית כמחרוזת הקסדצימלית.

התיקייה testdata מכילה תוכניות לדוגמה של APFv4 למסנני APF RA. התיקייה samples כוללת כלי עזר של Python שיוצרים תוכניות להעברת נתונים ב-APFv6. פרטים נוספים מופיעים במסמכי העזרה בקובצי כלי השירות של Python.

ניפוי באגים ב-APF

כדי לבדוק אם APF מופעל במכשיר, מציגים את התוכנית הנוכחית, מציגים את המונים הנוכחיים ומריצים את הפקודה adb shell dumpsys network_stack. דוגמה לפקודה הזו:

adb shell dumpsys network_stack
......
IpClient.wlan0 APF dump:
    Capabilities: ApfCapabilities{version: 4, maxSize: 4096, format: 1}
......
    Last program:
      6bfcb03a01b8120c6b9494026506006b907c025e88a27c025988a47c025488b87c024f88cd7c024a88e17c024588e384004408066a0e6bdca4022b000600010800060412147a1e016bd884021f00021a1c6b8c7c021c0000686bd4a402080006ffffffffffff6a266bbca402010004c0a801eb6bf87401f6120c84005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506c2fc393057dd6bf47401cb0a1e52f06bac7c01c600e06bb41a1e7e000001b9ffffffff6bb07e000001aec0a801ff6be868a4019a0006ffffffffffff6bb874019b6bf07401907c001386dd686bd0a4017d0006ffffffffffff6bc874017e0a147a0e3a6b980a267c017000ff6be07401650a366ba87c016200858219886a26a2050fff02000000000000000000000000006ba4740146aa0e84013700e6aa0f8c0130006068a4011b000f33330000000184c9b26aed4c86dd606a12a2f02600b03afffe8000000000000086c9b2fffe6aed4cff02000000000000000000000000000186006a3aa2e9024000123c92e4606a3ea2d70800000000000000006a56a2ce04030440c01a5a92c9601a5e92c4606a62a2bb04000000006a66a2a6102401fa00049c048400000000000000006a76a29d04030440c01a7a9298601a7e9293606c0082a28904000000006c0086a27310fdfd9ed67950000400000000000000006c0096a2690418033c001a9a9264606c009ea24e102401fa00049c048000000000000000006c00aea24404180330001ab2923f606c00b6a22910fdfd9ed67950000000000000000000006c00c6a21f04190300001aca921a606c00cea20410fdfd9ed67950000400000000000000016bc472086be4b03a01b87206b03a01b87201
    APF packet counters:
      TOTAL_PACKETS: 469
      PASSED_DHCP: 4
      PASSED_IPV4: 65
      PASSED_IPV6_NON_ICMP: 64
      PASSED_IPV4_UNICAST: 64
      PASSED_IPV6_ICMP: 223
      PASSED_IPV6_UNICAST_NON_ICMP: 6
      PASSED_ARP_UNICAST_REPLY: 4
      PASSED_NON_IP_UNICAST: 1
      DROPPED_RA: 4
      DROPPED_IPV4_BROADCAST_ADDR: 7
      DROPPED_IPV4_BROADCAST_NET: 27

הפלט של הפקודה adb shell dumpsys network_stack בדוגמה הזו כולל את הפרטים הבאים:

  • ApfCapabilities{version: 4, maxSize: 4096, format: 1}: המשמעות היא ששבבי ה-Wi-Fi תומכים ב-APF (גרסה 4).
  • Last program: הקטע הזה הוא הקובץ הבינארי העדכני של תוכנית APF שהותקנה, בפורמט של מחרוזת הקסדצימלית.
  • APF packet counters: בקטע הזה מוצג כמה מנות עוברות או נפסלות על ידי APF, והסיבות הספציפיות לכך.

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

echo "6bfcb03a01b8120c6b949401e906006b907c01e288a27c01dd88a47c01d888b87c01d388cd7c01ce88e17c01c988e384004008066a0e6bdca401af000600010800060412147a1e016bd88401a300021a1c6b8c7c01a00000686bd4a4018c0006ffffffffffff1a266bc07c018900006bf874017e120c84005408000a17821f1112149c00181fffab0d2a108211446a3239a205065a56483ac3146bf47401530a1e52f06bac7c014e00e06bb41a1e7e00000141ffffffff6be868a4012d0006ffffffffffff6bb874012e6bf07401237c001386dd686bd0a401100006ffffffffffff6bc87401110a147a0d3a6b980a267c010300ff6be072f90a366ba87af8858218886a26a2040fff02000000000000000000000000006ba472ddaa0e82d0aeaa0f8c00c9025868a2b60f5a56483ac3140c8126f3895186dd606a12a28b2600783afffe8000000000000002005efffe00026fff02000000000000000000000000000186006a3aa284024000123c94007d02586a3ea2700800000000000000006a56a26704190500001a5a94006002586a5ea23b2020014860486000000000000000006464200148604860000000000000000000646a7ea23204030440c01a8294002b02581a8694002402586c008aa21a04000000006c008ea204102a0079e10abcf60500000000000000006bc472086be4b03a01b87206b03a01b87201" | out/host/linux-x86/bin/apf_disassembler
       0: li    r1, -4
       2: lddw  r0, [r1+0]
       3: add   r0, 1
       5: stdw  r0, [r1+0]
       6: ldh   r0, [12]
       8: li    r1, -108
      10: jlt   r0, 0x600, 504
      15: li    r1, -112
      17: jeq   r0, 0x88a2, 504
      22: jeq   r0, 0x88a4, 504
      27: jeq   r0, 0x88b8, 504
      32: jeq   r0, 0x88cd, 504
      37: jeq   r0, 0x88e1, 504
      42: jeq   r0, 0x88e3, 504
      47: jne   r0, 0x806, 116
......

כדי לבדוק את תוצאות ה-APF במצב אופליין, משתמשים בכלי apf_run. כדי לקמפל את הקובץ הבינארי שניתן להפעלה, מריצים את הפקודה m apf_run. הכלי apf_run תומך במפרשי APFv4 ו-APFv6.

בהמשך מופיע המדריך לפקודה apf_run. כברירת מחדל, הפקודה apf_run מופעלת במפענח APFv4. העברת הארגומנט --v6 אל apf_run מאפשרת להפעיל אותו מול המפענח של APFv6. אפשר להשתמש בכל שאר הארגומנטים גם ב-APFv4 וגם ב-APFv6.

apf_run --help
Usage: apf_run --program <program> --pcap <file>|--packet <packet> [--data <content>] [--age <number>] [--trace]
  --program    APF program, in hex.
  --pcap       Pcap file to run through program.
  --packet     Packet to run through program.
  --data       Data memory contents, in hex.
  --age        Age of program in seconds (default: 0).
  --trace      Enable APF interpreter debug tracing
  --v6         Use APF v6
  -c, --cnt    Print the APF counters
  -h, --help   Show this message.

הנה דוגמה להעברת מנה אחת ל-APF כדי לבדוק אם אפשר להשליך או להעביר את המנה.

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

out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b9494010c06006b907c010588a27c010088a47c00fb88b87c00f688cd7c00f188e17c00ec88e384003908066a0e6bdca2d40600010800060412147a18016bd882ca021a1c6b8c7ac900686bd4a2b706ffffffffffff6a266bbca2b204c0a814656bf872a8120c84005808000a17821e1112149c00171fffab0d2a108210446a3239a204064651dbcc88ff6bf4727e0a1e52f06bac7a7be06bb41a1e7e0000006effffffff6bb07e00000063c0a814ff6be868a25106ffffffffffff6bb872536bf072497c001086dd686bd0a23806ffffffffffff6bc8723a0a147a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201 --packet 5ebcd79a8f0dc244efaab81408060001080006040002c244efaab814c0a8ca1e5ebcd79a8f0d --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Packet passed
Data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001

כדי לבדוק את התוצאות של APF מול קובץ ה-pcap שנוצר על ידי tcpdump, משתמשים בפקודה apf_run באופן הבא:

out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b989401df06006b947c01d888a27c01d388a47c01ce88b87c01c988cd7c01c488e17c01bf88e384004408066a0e6bdca401a5000600010800060412147a1e016bd884019900021a1c6b907c01960000686bd4a401820006ffffffffffff6a266bc0a4017b0004c0a82b056bf874017084005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506fabe589435936bf47401470a1e52f06bb07c014200e06bb81a1e7e00000135ffffffff6bb47e0000012ac0a82bff6be868a401160006ffffffffffff6bbc7401176bf074010c7c001086dd686bd0a2fb06ffffffffffff6bcc72fd0a147a0b3a6b9c0a267af1ff6be072e70a366bac7ae6858218886a26a2040fff02000000000000000000000000006ba872cbaa0e82be8eaa0f8c00b7025868a2a40ffabe5894359352a9874d08aa86dd606a12a2792600583afffe80000000000000f7d4e8ccd81ddb43fe80000000000000f8be58fffe94359386006a3aa272024108123c94006b02586a3ea25e0800000000000000006a56a25504030440c01a5a94004e02581a5e94004702586a62a23e04000000006a66a229102409891f9a26ae6d00000000000000006a76a22004190300001a7a94001902586a7ea204102409891f9a26ae6dba98e781ca9ef9ba6bc872086be4b03a01b87206b03a01b87201 --pcap apf.pcap --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
37 packets dropped
1733 packets passed
Data: 00000000000000000000000000000000000000000200000005000000000000000000000002000000000000001b000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000689000000000000003c00000000000000000000000000000000000006ea

כדי לבדוק את יכולות השידור של APFv6, משתמשים בפקודה apf_run באופן הבא:

$ apf_run --program 75001001020304050608060001080006040002AA300E3CAA0FBA06AA09BA07AA08BA086A01BA09120C84006F08066A0EA30206000108000604032B12147A27017A020203301A1C820200032D68A30206FFFFFFFFFFFF020E1A267E000000020A000001032C020B1A267E000000020A000001032CAB24003CCA0606CB0306CB090ACB0306C60A000001CA0606CA1C04AA
0A3A12AA1AAA25FFFF032F020D120C84001708000A1782100612149C00091FFFAB0D2A10820207032A02117C000E86DD68A30206FFFFFFFFFFFF021603190A1482020002187A023A02120A36820285031F8216886A26A2020FFF020000000000000000000000000003200214 --packet FFFFFFFFFFFF112233445566080600010800060400011122334455660A0000020000000000000A0000
01 --data 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 --age 0 --v6 --trace
      R0       R1       PC  Instruction
-------------------------------------------------
       0        0        0: data        16, 01020304050608060001080006040002
       0        0       19: debugbuf    size=3644
       0        0       23: ldm         r0, m[15]
       0        0       25: stdw        counter=6, r0
       0        0       27: ldm         r0, m[9]
       0        0       29: stdw        counter=7, r0
       0        0       31: ldm         r0, m[8]
 134d811        0       33: stdw        counter=8, r0
 134d811        0       35: li          r0, 1
       1        0       37: stdw        counter=9, r0
       1        0       39: ldh         r0, [12]
     806        0       41: jne         r0, 0x806, 157
     806        0       46: li          r0, 14
       e        0       48: jbseq       r0, 0x6, 59, 000108000604
       e        0       59: ldh         r0, [20]
       1        0       61: jeq         r0, 0x1, 103
       1        0      103: ldw         r0, [38]
 a000001        0      105: jeq         r0, 0xa000001, 116
 a000001        0      116: allocate    60
 a000001        0      120: pktcopy     src=6, len=6
 a000001        0      123: datacopy    src=3, len=6
 a000001        0      126: datacopy    src=9, len=10
 a000001        0      129: datacopy    src=3, len=6
 a000001        0      132: write       0x0a000001
 a000001        0      137: pktcopy     src=6, len=6
 a000001        0      140: pktcopy     src=28, len=4
 a000001        0      143: ldm         r0, m[10]
      2a        0      145: add         r0, 18
      3c        0      147: stm         r0, m[10]
      3c        0      149: transmit    ip_ofs=255
      3c        0      153: drop        counter=47
Packet dropped
Data: 00000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000100000011d8340100000000000000000000000000000000000000000100000078563412
transmitted packet: 112233445566010203040506080600010800060400020102030405060a0000011122334455660a000002000000000000000000000000000000000000

כשמשתמשים בפרמטר --trace, הכלי apf_run מספק פלט מפורט של כל שלב בהרצה של המפענח, וזה עוזר בניפוי באגים. בדוגמה הזו, אנחנו מזינים מנה של שאילתת ARP לתוכנית APF. הפלט מראה ששאילתת ה-ARP נפסלה, אבל נוצרה חבילת תשובה. הפרטים של החבילה שנוצרה מוצגים בקטע transmitted packet.

בעיות נפוצות בשילוב

בקטע הזה נפרט כמה בעיות נפוצות שנתקלים בהן במהלך השילוב של APF:

  • ניקוי לא צפוי של אזור נתונים: הזיכרון של APF צריך להיות מוקדש כולו ל-APF. רק קוד המפרש או קוד המסגרת (דרך HAL API) יכולים לשנות את אזור הזיכרון של APF.
  • בעיות בהתקנה של תוכניות APF בגודל X בייט (X <= maxLen): הקושחה צריכה לתמוך בקריאה או בכתיבה של תוכניות בכל אורך עד maxLen ללא כשלים, קריסות או חיתוך. פעולות כתיבה לא יכולות לשנות אף בייט בין X לבין maxLen.
  • הטמעה של APF בקוד של מנהל ההתקן: צריך להטמיע את APF רק בקושחה, ולא בקוד של מנהל ההתקן. אחרת, לא תהיה תועלת בחיסכון באנרגיה כי המעבד צריך להתעורר כדי לעבד את המנה.
  • ערכים שגויים של filter_age או filter_age_16384th: צריך להעביר את הערכים של filter_age (APFv4) ושל filter_age_16384th (APFv6) בצורה נכונה לפונקציות accept_packet() ו-apf_run(). לפרטים על חישוב filter_age_16384th, אפשר לעיין בתיעוד ב-apf_interpreter.h.
  • התכונה APF לא מופעלת כשנדרש: התכונה APF צריכה להיות מופעלת כשהמסך כבוי והקישור ל-Wi-Fi לא פעיל או שהתנועה נמוכה מ-10 Mbps.
  • מנות קטומות שהועברו אל accept_packet() או אל apf_run(): כל המנות מסוג unicast,‏ broadcast ו-multicast שהועברו אל accept_packet() או אל apf_run() חייבות להיות שלמות. העברת מנות קטומות ל-APF לא תקינה.

בדיקות APF

החל מ-Android 15, מערכת Android מספקת תרחישי בדיקה של CTS למכשיר יחיד ולמספר מכשירים לשילוב של מסנן APF ומתורגמן APF, כדי להבטיח את הפונקציונליות הנכונה של APF. הנה פירוט של המטרה של כל מקרה בדיקה:

  • ApfFilter ו-apf_interpreter בדיקת שילוב: בודקת ש-ApfFilter יוצר קוד בייט נכון, ו-apf_interpreter מבצע את הקוד בצורה נכונה כדי להפיק את התוצאות הצפויות.
  • APF single-device CTS: משתמש במכשיר יחיד כדי לבדוק את הפונקציונליות של APF בערכת השבבים של Wi-Fi. מוודאים את הפרטים הבאים:
    • התכונה APF מופעלת כשהמסך כבוי ותנועת הגולשים ב-Wi-Fi נמוכה מ-10 Mbps.
    • היכולות של APF מוצהרות בצורה נכונה.
    • פעולות קריאה וכתיבה באזור הזיכרון של ה-APF מצליחות, ואזור הזיכרון לא משתנה באופן בלתי צפוי.
    • הארגומנטים מועברים בצורה נכונה אל accept_packet() או אל apf_run().
    • קושחה שמשולבת עם APFv4/APFv6 יכולה להשליך מנות.
    • קושחה שמשולבת עם APFv6 יכולה להשיב לחבילות.
  • APF multi-device CTS: משתמש בשני מכשירים (אחד לשליחה ואחד לקבלה) כדי לבדוק את התנהגות הסינון של APF. בצד השולח נוצרים סוגים שונים של מנות, והבדיקה מאשרת אם הן נשמטות, מועברות או משיבות בצורה נכונה על סמך הכללים שהוגדרו ב-ApfFilter.

הוראות נוספות לבדיקות שילוב

בנוסף, אנחנו ממליצים מאוד לספקי ערכות שבבים לשלב בדיקות של APF בחבילות הבדיקה שלהם לשילוב Wi-Fi בקושחה.

שילוב של בדיקות APF בחבילות בדיקה של שילוב Wi-Fi בקושחה הוא חיוני כדי לוודא שהפונקציונליות של APF תקינה בתרחישי חיבור מורכבים ל-Wi-Fi, כמו תרחישי חיבור של make-before-break או של נדידה ב-Wi-Fi. הוראות מפורטות לביצוע בדיקות שילוב מופיעות בקטע הבא.

דרישות מוקדמות

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

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

תרחישי בדיקה

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

תוכנית APF 1

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

הלוגיקה של תוכנית APF 1 היא כזו:

  1. הוספה והגדלה של מונה:
    1. ערכי EtherType: ‏ 0x88A2, ‏ 0x88A4, ‏ 0x88B8, ‏ 0x88CD, ‏ 0x88E1, 0x88E3
    2. מנות גילוי או בקשה של DHCP ב-IPv4
    3. חבילות RS
  2. העברה והגדלה של מונה: כל שאר החבילות.

הקודים של תוכנית APF באורך בית אחד הם:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C005D88A27C005888A47C005388B87C004E88CD7C004988E17C004488E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE8721D120C84000E86DD0A1482093A0A368204856BE072086BDCB03A01B87206B03A01B87201
APF program 2

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

הלוגיקה של תוכנית APF 2 היא כזו:

  1. הוספה והגדלה של מונה:
    1. ערכי EtherType: ‏ 0x88A2, ‏ 0x88A4, ‏ 0x88B8, ‏ 0x88CD, ‏ 0x88E1, 0x88E3
    2. מנות גילוי או בקשה של DHCP ב-IPv4
    3. חבילות RS
  2. הורדה והגדלה של מונה: מנות של בקשות פינג ICMP
  3. העברה והגדלה של מונה: כל שאר החבילות

הקודים של תוכנית APF (בגודל 2 בייט) הם:

6BF0B03A01B86BF8AA0FB86BF4AA09B8120C6BEC7C007488A27C006F88A47C006A88B87C006588CD7C006088E17C005B88E3120C84002008001A1A821B001A1E8600000010FFFFFFFF0A17820B11AB0D2A108204436BE87234120C84000E86DD0A1482093A0A368204856BE0721F120C84001008000A17820B01AB0D220E8204086BE472086BDCB03A01B87206B03A01B87201
אימות נתונים

כדי לוודא שתוכנית ה-APF מופעלת ושהחבילות מועברות או מושלכות בצורה נכונה, מבצעים את הפעולות הבאות:

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

    שם המונה מיקום הזיכרון
    DROPPED_ETHERTYPE_DENYLISTED [ApfRamSize - 20, ApfRamSize - 16]
    DROPPED_DHCP_REQUEST_DISCOVERY [ApfRamSize - 24, ApfRamSize - 20]
    DROPPED_ICMP4_ECHO_REQUEST [ApfRamSize - 28, ApfRamSize - 24]
    DROPPED_RS [ApfRamSize - 32, ApfRamSize - 28]
    PASSED_PACKET [ApfRamSize - 36, ApfRamSize - 32]

פסאודו-קוד לתוכנית APF 1 ולתוכנית APF 2

הקוד המדומה הבא מסביר את הלוגיקה של תוכנית APF 1 ותוכנית APF 2 בפירוט:

// ethertype filter
If the ethertype in [0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3]:
    drop packet and increase counter: DROPPED_ETHERTYPE_DENYLISTED

// dhcp discover/request filter
if ethertype != ETH_P_IP:
    skip the filter
if ipv4_src_addr != 0.0.0.0:
    skip the filter
if ipv4_dst_addr != 255.255.255.255
    skip the filter
if not UDP packet:
    skip the filter
if UDP src port is not dhcp request port:
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_DHCP_REQUEST_DISCOVERY

// Router Solicitation filter:
if ethertype != ETH_P_IPV6:
    skip the filter
if not ICMP6 packet:
    skip the filter
if ICMP6 type is not a Router Solicitation:
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_RS

// IPv4 ping filter (only included in Program 2)
if ethertype != ETH_P_IP:
    skip the filter
if it ipv4 protocol is not ICMP:
    skip the filter
if port is not a ping request port
    skip the filter
else:
    drop the packet and increase the counter: DROPPED_ICMP4_ECHO_REQUEST

pass the packet and increase: PASSED_PACKET