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 göre filtreleme kurallarını değiştirmesine izin verirken, sistemin paketleri donanıma bırakarak güç tasarrufu yapmasına olanak tanır.

APF'ye genel bakış

APF iki ana bileşenden oluşur:

  • APF yorumlayıcısı ağ donanımında (tipik olarak Wi-Fi yonga seti) çalışır. APF yorumlayıcısı, donanım tarafından alınan paketler üzerinde APF bayt kodunu çalıştırır ve bunların kabul edilip edilmeyeceğine karar verir.
  • APF program oluşturma kodu ana CPU'da çalışır. Kod, ağ ve cihaz durumuna göre APF programları oluşturur ve günceller.

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

Uygulanan birkaç APF filtresi vardır. Örneğin, APF, izin verilmeyen eter türlerini bırakmak, IPv6 yönlendirici reklam (RA) paketlerini filtrelemek, çok noktaya yayın kilidi tutulmuyorsa çok noktaya yayın ve yayın trafiğini filtrelemek, diğer ana bilgisayarlar için DHCP paketlerini bırakmak ve istenmeyen adres çözümleme protokolünü (ARP) bırakmak için filtreler içerir. ve (komşu keşfi) ND paketleri. Filtrelerin tam listesi ApfFilter tanımlanmıştır.

APF program oluşturma kodu Ağ Yığını modülünün bir parçası olduğundan, aylık Ana Hat güncellemeleri aracılığıyla filtreleme mantığı güncellenebilir ve yeni filtreler eklenebilir.

APF entegrasyonu

APF API'si apf_interpreter.h dosyasında tanımlanmıştır. Wi-Fi donanım yazılımı kodu, paketin düşürülmesi mi (sıfır dönüş değeri) yoksa iletilmesi mi (sıfırdan farklı dönüş değeri) gerektiğini belirlemek için int accept_packet() işlevini çağırır. APF talimatları değişken uzunluktadır. Her talimat en az bir bayt uzunluğundadır. APF talimat kodları apf.h tanımlanmıştır.

APF ayrılmış belleğe dayanır. Bellek hem APF programının kendisi hem de veri depolama için kullanılır ve bellek, APF HAL yöntemleri dışında yonga seti tarafından temizlenmemeli veya yazılmamalıdır. APF bayt kodu, kabul edilen ve bırakılan paketlere ilişkin sayaçları depolamak için veri depolamayı kullanır. Veri bölgesi Android çerçevesinden okunabilir. APF'nin kullanabileceği minimum bellek miktarı 1024 bayt olmalıdır.

APF'de hata ayıklama

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 komutun bir örneği 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 örnekteki adb shell dumpsys network_stack komutunun çıktısı aşağıdakileri içerir:

  • ApfCapabilities{version: 4, maxSize: 4096, format: 1} : Bu, Wi-Fi yongalarının APF'yi (sürüm 4) desteklediği anlamına gelir.
  • Last program : Bu bölüm, onaltılık dize formatında en son yüklenen APF programı ikilisidir.
  • APF packet counters : Bu bölüm APF tarafından kaç paketin iletildiğini veya bırakıldığını ve bunların belirli nedenlerini gösterir.

Kodun kodunu çözmek ve insan tarafından okunabilen birleştirici diline dönüştürmek için apf_disassembler aracını kullanın. Yürütülebilir ikili dosyayı 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ışı kontrol etmek için apf_run aracını kullanın. Yürütülebilir ikili dosyayı derlemek için m apf_run komutunu çalıştırın. Aşağıda apf_run komutunu kullanarak tek bir paketin nasıl kontrol edileceğine 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 sayaç 4 bayt uzunluğunda olduğundan, veri bölgeleri arabellek taşması oluşmamasını sağlayacak kadar 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ına göre kontrol etmek için apf_run komutunu aşağıdaki gibi kullanın:

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