Android Paket Filtresi

Android Paket Filtresi (APF), çerçevenin çalışma zamanında donanım paketi filtreleme mantığını kontrol etmesini sağlar. Bu, Android çerçevesinin çalışma zamanında ağ koşullarına bağlı olarak filtreleme kurallarını değiştirmesine izin verirken, sistem de donanımdaki paketleri bırakarak güç tasarrufu sağlar.

APF'ye genel bakış

APF iki ana bileşenden oluşur:

  • APF yorumlayıcısı, ağ donanımında (genellikle kablosuz yonga seti) çalışır. APF yorumcusu, donanım tarafından alınan paketler üzerinde APF bayt kodu çalıştırır ve bunları kabul etmeye veya bırakmaya karar verir.
  • APF programı oluşturma kodu ana CPU'da çalışır. Bu kod, APF programlarını ağ ve cihaz durumuna göre oluşturup günceller.

Kablosuz HAL yöntemleri, Android çerçevesinin APF programı bayt kodunu yüklemesine ve mevcut sayaçları okumasına olanak tanır. Ağ Grubu Mainline modülü, APF çalışırken herhangi bir zamanda APF programının bayt kodunu güncelleyebilir.

Çeşitli APF filtreleri uygulanmıştır. Örneğin APF'de izin verilmeyen ethertype'ları bırakma, IPv6 yönlendirici reklamı (RA) paketlerini filtreleme, çoklu yayın kilidi açık değilse çoklu yayın ve yayın trafiğini filtreleme, diğer ana makineler için DHCP paketleri bırakma ve istenmeyen adres çözümleme protokolü (ARP) ve (komşu keşif) ND paketlerini bırakma filtreleri bulunur. Filtrelerin tam listesi ApfFilter içinde tanımlanmıştır.

APF program oluşturma kodu Ağ Yığını modülünün bir parçası olduğundan filtreleme mantığı güncellenebilir ve aylık Mainline güncellemelerle yeni filtreler eklenebilir.

APF entegrasyonu

APF API, apf_interpreter.h bölümünde tanımlanmıştır. Kablosuz donanım yazılımı kodu, paketin çıkarılması mı (sıfır dönüş değeri) yoksa geçilmesi mi (sıfır olmayan bir değer döndürülmesi) gerektiğini belirlemek için int accept_packet() yöntemini çağırır. APF talimatları değişken uzunluktadır. Her talimat en az bir bayt uzunluğundadır. APF talimat kodları, apf.h bölümünde tanımlanmıştır.

APF özel belleğe dayanır. Bellek hem APF programının kendisi hem de veri depolama için kullanılır. APF HAL yöntemleri dışında bellek, yonga seti tarafından temizlenmemeli veya yazılmamalıdır. APF bayt kodu, kabul edilen ve bırakılan paketler için sayaçları depolamak üzere veri depolama alanını kullanır. Veri bölgesi, Android çerçevesinden okunabilir. APF için kullanılabilen minimum bellek miktarı 1.024 bayt olmalıdır.

APF'de hata ayıkla

Cihazda APF'nin etkin olup olmadığını kontrol etmek, mevcut programı görüntülemek ve mevcut sayaçları göstermek için adb shell dumpsys network_stack komutunu çalıştırın. Aşağıda, bu komuta bir örnek verilmiştir:

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

Bu örnek adb shell dumpsys network_stack komutunun çıkışı şunları içerir:

  • ApfCapabilities{version: 4, maxSize: 4096, format: 1}: Bu, kablosuz çiplerin APF'yi (sürüm 4) desteklediği anlamına gelir.
  • Last program: Bu bölüm, onaltılık dize biçimindeki en son yüklenen APF programı ikili programıdır.
  • APF packet counters: Bu bölümde, APF tarafından kaç paketin geçtiği veya bırakıldığı ve bunun belirli nedenleri gösterilir.

Kodu çözmek ve okunabilir bir derleyici diline ayırmak için apf_disassembler aracını kullanın. Yürütülebilir ikili programı derlemek için m apf_disassembler komutunu çalıştırın. Aşağıda, apf_disassembler aracının nasıl kullanılacağına dair bir örnek verilmiştir.

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 sonuçlarını çevrimdışı olarak kontrol etmek için apf_run aracını kullanın. Yürütülebilir ikili programı derlemek için m apf_run komutunu çalıştırın. Aşağıda, apf_run komutunu kullanarak tek bir pakete göre nasıl kontrol yapılacağına dair bir örnek verilmiştir.

Ham paketin onaltılık ikili dize sunumunu sağlamak için --packet seçeneğini kullanın. APF sayacını depolamak için kullanılan veri bölgesinin onaltılık ikili dizesini sağlamak için --data option kullanın. Her bir sayaç 4 bayt uzunluğunda olduğundan veri bölgeleri, arabellek taşması olmaması için yeterince uzun olmalıdır.

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

APF sonuçlarını, tcpdump tarafından alınan pcap dosyasıyla karşılaştırarak kontrol etmek için apf_run komutunu aşağıdaki şekilde kullanın:

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