অ্যান্ড্রয়েড প্যাকেট ফিল্টার

Android প্যাকেট ফিল্টার (APF) ফ্রেমওয়ার্ককে রানটাইমে হার্ডওয়্যার প্যাকেট ফিল্টারিং লজিক নিয়ন্ত্রণ করতে দেয়। এটি সিস্টেমকে হার্ডওয়্যারে প্যাকেট ফেলে পাওয়ার সাশ্রয় করতে দেয়, যখন অ্যান্ড্রয়েড ফ্রেমওয়ার্ককে নেটওয়ার্ক অবস্থার উপর ভিত্তি করে রানটাইমে ফিল্টারিং নিয়ম পরিবর্তন করতে দেয়।

এপিএফ ওভারভিউ

APF দুটি প্রধান উপাদান নিয়ে গঠিত:

  • APF দোভাষী নেটওয়ার্কিং হার্ডওয়্যার (সাধারণত, Wi-Fi চিপসেট) এ চলে। APF দোভাষী হার্ডওয়্যার দ্বারা প্রাপ্ত প্যাকেটগুলিতে APF বাইটকোড চালায় এবং সেগুলি গ্রহণ বা ফেলে দেওয়ার সিদ্ধান্ত নেয়।
  • APF প্রোগ্রাম জেনারেশন কোড প্রধান CPU-তে চলে। কোডটি নেটওয়ার্ক এবং ডিভাইসের অবস্থা অনুযায়ী APF প্রোগ্রাম তৈরি এবং আপডেট করে।

Wi-Fi HAL পদ্ধতিগুলি অ্যান্ড্রয়েড ফ্রেমওয়ার্ককে APF প্রোগ্রাম বাইটকোড ইনস্টল করতে এবং বর্তমান কাউন্টারগুলি পড়ার অনুমতি দেয়। নেটওয়ার্ক স্ট্যাক মেইনলাইন মডিউল APF চলাকালীন যেকোনো সময় APF প্রোগ্রাম বাইটকোড আপডেট করতে পারে।

বাস্তবায়িত বেশ কয়েকটি APF ফিল্টার আছে। উদাহরণ স্বরূপ, APF-এ অননুমোদিত ইথারটাইপগুলি ড্রপ করার জন্য ফিল্টার, IPv6 রাউটার বিজ্ঞাপন (RA) প্যাকেটগুলি ফিল্টার করা, মাল্টিকাস্ট লক রাখা না থাকলে মাল্টিকাস্ট এবং সম্প্রচার ট্র্যাফিক ফিল্টার করা, অন্যান্য হোস্টের জন্য DHCP প্যাকেট ড্রপ করা এবং অযাচিত ঠিকানা রেজোলিউশন প্রোটোকল (ARP) ড্রপ করা এবং (প্রতিবেশী আবিষ্কার) এনডি প্যাকেট। ফিল্টারের সম্পূর্ণ তালিকা ApfFilter এ সংজ্ঞায়িত করা হয়েছে।

যেহেতু APF প্রোগ্রাম জেনারেশন কোড নেটওয়ার্ক স্ট্যাক মডিউলের অংশ, তাই মাসিক মেইনলাইন আপডেটের মাধ্যমে ফিল্টারিং লজিক আপডেট করা যেতে পারে এবং নতুন ফিল্টার যোগ করা যেতে পারে।

এপিএফ ইন্টিগ্রেশন

APF API apf_interpreter.h এ সংজ্ঞায়িত করা হয়েছে। Wi-Fi ফার্মওয়্যার কোড int accept_packet() কল করে প্যাকেটটি বাদ দেওয়া উচিত কিনা (শূন্য রিটার্ন মান) বা পাস করা উচিত (শূন্য রিটার্ন মান)। APF নির্দেশাবলী পরিবর্তনশীল দৈর্ঘ্য. প্রতিটি নির্দেশের দৈর্ঘ্য কমপক্ষে এক বাইট। APF নির্দেশাবলীর কোডগুলি apf.h এ সংজ্ঞায়িত করা হয়েছে।

APF ডেডিকেটেড মেমরির উপর নির্ভর করে। মেমরিটি APF প্রোগ্রাম এবং ডেটা স্টোরেজ উভয়ের জন্যই ব্যবহৃত হয় এবং APF HAL পদ্ধতি ব্যতীত মেমরিটি চিপসেট দ্বারা সাফ বা লেখা যাবে না। APF বাইটকোড গৃহীত এবং ড্রপ করা প্যাকেটের জন্য কাউন্টার সংরক্ষণ করতে ডেটা স্টোরেজ ব্যবহার করে। ডেটা অঞ্চলটি অ্যান্ড্রয়েড ফ্রেমওয়ার্ক থেকে পড়া যায়। APF-এর কাছে পাওয়া মেমরির ন্যূনতম পরিমাণ 1024 বাইট হতে হবে।

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 কমান্ড ব্যবহার করে একটি একক প্যাকেটের বিরুদ্ধে কীভাবে পরীক্ষা করা যায় তার একটি উদাহরণ নিচে দেওয়া হল।

কাঁচা প্যাকেটের হেক্স বাইনারি স্ট্রিং উপস্থাপনা প্রদান করতে, --packet বিকল্পটি ব্যবহার করুন। ডেটা অঞ্চলের হেক্স বাইনারি স্ট্রিং প্রদান করতে, যা APF কাউন্টার সংরক্ষণ করতে ব্যবহৃত হয়, --data option ব্যবহার করুন। যেহেতু প্রতিটি কাউন্টার 4 বাইট দীর্ঘ, কোনো বাফার ওভারফ্লো হয় না তা নিশ্চিত করার জন্য ডেটা অঞ্চলগুলি অবশ্যই যথেষ্ট দীর্ঘ হতে হবে।

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

tcpdump দ্বারা নেওয়া pcap ফাইলের বিপরীতে APF ফলাফল পরীক্ষা করতে, apf_run কমান্ডটি নিম্নরূপ ব্যবহার করুন:

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