Xiaomiの携帯電話とそれらとの戦いについてもう少し。 更新しました

画像



正直なところ、私はこの記事を書いて公開する予定はありませんでしたが、2か月後に同僚たちとXiaomiから購入したばかりの5台の電話、そして最近Xiaomiスマートホーム管理を宣伝するGeektimesの記事を見ました。良心がやって来て、 stsukoは知識を他の人と共有することを要求した。



最初に、対象になっていない人のための小さな紹介。 そのような会社Xiaomiがあります。これは、カスタマイズされたAndroidを充填して注ぐのに良い携帯電話を作っています。 このビジネスモデルは、最近公式に発表されたように、「実際、私たちはそれからお金を稼ぐことなくスマートフォンを配布しています。 長期的な収入源にもっと関心を持っています。 100億台のスマートフォンを販売することはできますが、1セントは獲得できません。」 1回2回のソース。



セキュリティラボに関する9月の記事この苦情さえも一目見ただけで、個人的には、Xiaomiの携帯電話は所有者がBig Brotherに駆り立てられる綱のようなものであると感じていました(もちろん誇張します)。



これは、携帯電話Xiaomi redmi 3Sの動作の研究を実施する主な動機でした。

ファームウェアMIUI Global 8.1 Stable 8.1.1.0(MALMIDI)



実験ウサギの検査と問題検出

新品の電話を箱から取り出します。 Wi-Fiルーターでトラフィックの記録を有効にした後、電源を入れて初期セットアップウィザードを実行します。 電話がアクセスポイントに接続してからちょうど2秒後に、Xiaomiサーバーの1つからサイズが約8 MBのファイルのダウンロードが開始されました。 これは通常のzipアーカイブであり、その中にはSecurityLabの記事で言及されているAnalyticsCore.apkファイルを含むすべてのものがたくさんあります。



もっともっと。 合計で、観測期間全体で、異なるドメイン内の8ダース弱のサーバー名をカウントしました。 この番号には、GoogleおよびFacebookサーバーがなく、そのアプリケーションもプリインストールされていることをすぐに予約してください。 別々に数えたからです。 彼らも、すべてが「楽しい」です。



Xiaomiサーバーへの接続のほとんどはHTTPS経由で行われたため、直接送信された内容の詳細を把握することはできませんでした。 あらゆる種類のログイン、同期などを無効にする このトラフィックは消えませんでした。



さらに、ほとんどの部分でリクエストが小さかった(TCPセッションの送信トラフィックの受信量が1〜2 KBを超えなかった)ことは恥ずかしいことでしたが、 私たちのモバイルオペレーターはトラフィックの量を切り上げるため(たとえば、Tele2を150Kbに)、一致が失敗した場合、この方法でかなりの量のトラフィックを「ポンピング」できます。



この事実を気にしない人は、これ以上読むことはできません。 さらに、工場ファームウェアに縫い付けられたアプリケーションからトラフィックを分離する詳細についても説明します。



前提条件



最初に必要なことは、電話をルート化することです。 Xiaomiの場合、これがどのように行われるかについては説明しません。この方法でこの記事の完全版にアクセスしたい人を送ります(最後のリンク)。

2つ目は、ケーブルを介してファームウェアを電話機に流し込み、すべてのユーザーデータを消去することです。

第三に、携帯電話は新鮮なファームウェアの湾の後、インターネットにアクセスできないはずです。

更新する もちろん、以下に説明する制限のインストールまで。



Disclamier あなたは、あなた自身の危険とリスクで電話ですべてのさらなる操作をします。

結果の責任は、以下で説明するアクションを誰が正確に行ったかにあります。



小規模な技術紹介



電話がアクセスするサーバーは、ほとんどがAmazonクラウドにあるため、ラウンドロビンDNSを介して異なる/ 16サブネットの異なるIPアドレスに解決される名前でアクセスされます。 それらをすべてサブネット上でブロックしても意味がありません。インターネットの半分を除外できますが、これは良くありません。 名前によるブロックは適切ですが、L3ドメインからのホスト名が動的に生成されないという事実はありません。 Xiaomiサーバーにアクセスするすべてのアプリケーションを打ち負かすことは理想的ですが、実際に示されているように、Androidでの統合の深さは、それらの一部を削除した後、電話が単にロードを拒否するようなものです。



次。 外部サーバーは複数のプロセスによってアクセスされますが、多くの場合、タスクはAndroid UID共有の存在によって複雑になりますが、異なるプロセス(アプリケーション)が同じUIDでネットワークトラフィックを生成できる場合です。 さらに、有用なプロセス(GPSを担当)の1つを外部にリリースして小さなアップデートをダウンロードする必要がありますが、同時にXiaomiサーバーに突入する8つのプロセスと同じUIDの下にありました。



また、上記の問題を解決するために利用可能なツールの制限に言及する必要があります。 Playマーケットで利用可能なネームファイアウォールを持つほとんどのアプリケーションは、いわゆる VPN、つまり アプリケーションを起動する前の情報漏えいに対する保護はありません。



以下でプロのAndroid開発者向けに議論されることのほとんどはありふれた真実ですが、他のすべての人にとって、フィルタリングがこのように構築されている理由を理解するのに役立ちます。



/ etcにある構成ファイルと起動スクリプトがある通常のLinuxとは異なり、Androidではすべてが少し異なります。 一般的なネットワーク管理は、netdシステムデーモンによってプルされるConnection Managerによって提供されます。netdシステムデーモンは、特定のコマンドラインパラメーターでiptablesを呼び出します。 したがって、ブートスクリプト(initなど)からIPtablesを呼び出すことはあまり意味がありません。netdは起動時にiptablesを呼び出し、ルールをクリアし、独自に入力します。



Googleが残した唯一の方法は、必要なiptables構成コマンドをスクリプト/system/bin/oem-iptables-init.shに書き込むことです。 このスクリプトへのパスとその名前は、netdデーモンのソースコード内にハードコーディングされています。



静的ホスト名をフィルタリングするには、/ etc / hostsファイルを編集できますが、その番号と動的生成の可能性に留意してください。

次に、これがすべて行われたという話があります。



不要なプログラムの削除とフリーズ(不明な場合)



Titanium Backupの無料バージョンを使用すると、システムに表示されるプログラムの名前(Play Market)とそのコード名(com.google.vending)の対応を確認でき、必要に応じて明らかに不要なものを削除できます。



無料版の欠点は、プログラムをフリーズする方法がわからないことです。したがって、パッケージマネージャーを使用してADBシェルからフリーズします。 例:



root@land:/ # pm disable com.miui.analytics
pm disable com.miui.analytics
Package com.miui.analytics new state: disabled
root@land:/ # pm disable com.miui.systemAdSolution
pm disable com.miui.systemAdSolution
Package com.miui.systemAdSolution new state: disabled
root@land:/ # reboot
reboot
      
      







Disclamier 2. «» . — .



.



1. C — /etc/hosts c IP 127.0.0.1. Google Drive Files.

— L3/L4.



Update. Netfilter/IPtables. , . — . -, .

--wait, . , , IPtables , , , , , .



2. /16 /24 Netfilter/IPtables oem-iptables-init.sh. , , .

Update. — Amazon (round-robin DNS) IP . /16, . . ( ) .



3. DNS . , .



Updated. IPtables, Android , . , DNS (UID 0) :



$IPTABLES -A oem_out --protocol udp --dport 53 -m owner --uid-owner 0 -m string --algo bm --hex-string '|04|miui|03|com|00|' -m comment --comment "Deny UID 0 DNS queries for miui.com domain" -j DROP
#
$IPTABLES -A oem_out --protocol udp --dport 53 -m owner --uid-owner 0 -j ACCEPT
      
      





Updated. UDP , (UID 0) 53 UDP IP 046d69756903636f6d00 ( DNS .miui.com). IPtables |04|miui|03|com|00| 046d69756903636f6d00.

--hex-string — , IPtables . - DNS , . (00h).



DNS . , iptables -L -v .



4. Assited GPS QualComm UID 1000. , .. , DNS , — TCP c SYN, ACK , HTTP , HTTP . TCP , .

3-4 :



#    TCP   80      UID 1000.
$IPTABLES -A oem_out -m owner --uid-owner 1000 --protocol tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
#   xtrapath   TCP     80    UID 1000        5555.
$IPTABLES -A oem_out -m owner --uid-owner 1000 --protocol tcp --dport 80 -m conntrack --ctstate ESTABLISHED -m string --algo bm --string 'xtrapath' -j CONNMARK --set-xmark 0x5555
#       UID 1000 TCP       5555
$IPTABLES -A oem_out -m owner --uid-owner 1000 --protocol tcp --dport 80 -m conntrack --ctstate ESTABLISHED -m connmark ! --mark 0x5555 -j DROP

      
      





5. ( Google Chrome UID 10060). Google Chrome .



$IPTABLES -A oem_out -m owner --uid-owner 10060 -m comment --comment "Permit Google Chrome internet access" -j ACCEPT
#
# Block all other processes
#
$IPTABLES -A oem_out -m owner --uid-owner 0-9999 -m comment --comment "Block all other system processes internet access" -j DROP
$IPTABLES -A oem_out -m owner --uid-owner 10000-99999 -m comment --comment "Block all other user processes internet access" -j DROP

      
      





UID Netfilter/IPtables. TCP Google, UID. , Google Captive portal login. — ADB shell:



root@land:/ # settings put global captive_portal_detection_enabled 0
root@land:/ # reboot

      
      





, ( Wi-Fi ), UID .



Update. . «» , 127.0.0.1, .

.

, , :

$IPTABLES -A oem_out --protocol all --source 127.0.0.0/8 --destination 127.0.0.0/8 -m comment --comment "Accept internal traffic" --jump ACCEPT
$IPTABLES -A oem_out --protocol all -m owner ! --uid-owner 0-99999 -m comment --comment "Drop any traffic which does not have UID." --jump DROP

      
      





Update. , UID , , / . , Netfilter/IPtables .

, , , , , UID ( ) Netfilter/IPtables.

— — . , , — . /dev . , .

, .



# Permit intenet access for the packages listed at the end of this file. White list mode. 
#
SU=`/system/bin/which su`
# changing reading file behavior (read whole file with \r\n into variable)
IFS=""
# reading first and second fields of every line of the system packages database into variable PACKAGESDB. 
# Escalating privileges via su because of filesystem packages database file access limitations.
PACKAGESDB=`$SU -c "/system/bin/cut -d' ' -f 1,2 /data/system/packages.list"`
#
# Reading last lines of current script form the end till "exit 0" line
# Filtering empty lines, lines started with # and all symbols after # (comments) in every line.
# 
# 's/#.*//' - remove all in every line after #
# '/^#/d' - remove lines staring with #
# '/./!d' - remove empty lines
# '/exit 0/,$ d' - remove all lines starting line with "exit 0"
# 's/ //g' - remove spaces from line
#
/system/bin/tac $0 | /system/bin/sed -e '/^#/d' -e 's/#.*//' -e '/exit 0/,$ d' -e '/./!d' -e 's/ //g'| while read line;
do
# Just in case 8-)
OUR_PACKAGE_NAME=$line
# Strict checking for existence of our package name in the system packages database. Checking first field.
PACKAGE_NAME_IN_DB=`echo $PACKAGESDB | /system/bin/cut -f 1 -d' ' | /system/bin/grep -Fx "$line"`
if
# Checking grep utility exit code. "0" means pattern found
test "$?" == "0"
then
#
# Looking for package UID in database. Checking second field. VERY important space after $line!!!
#
PACKAGE_UID=`echo $PACKAGESDB |  /system/bin/grep "$line " | /system/bin/cut -f 2 -d' '`
else
# All other exit codes return us to the beginning of the cycle.
# echo "Package $OUR_PACKAGE_NAME not found"
$IPTABLES -A $CHAIN -m comment --comment "Package name $OUR_PACKAGE_NAME not found. Check package name." --jump LOG
continue
fi
#
# Set the package right for Internet access
# 
$IPTABLES -A $CHAIN -m owner --uid-owner $PACKAGE_UID -m comment --comment "Permit $OUR_PACKAGE_NAME Internet access" -j ACCEPT
#
done
######
... skipped...
####
exit 0
#### 
####### Do NOT edit before this line #########
# Please add package names and comments after this line for granting them internet access.
#####
# Google Play Store and its companion processes
# 
com.google.android.gms # Google Services Framework Internet access
com.android.vending # Google Play Market internet access
com.android.providers.downloads # Download manager service internet access
#
# Other Google apps
com.google.android.youtube # Youtube application internet access
com.google.android.apps.maps # Google Maps application internet access
com.google.android.googlequicksearchbox # Google Assistant internet access
#
#
com.android.chrome # Google Chrome browser internet access

      
      







/ .



6. Netfilter/IPtables :



$IPTABLES -A oem_out --source 10.1.30.42 --protocol tcp --jump LOG --log-prefix "IPtables log:" --log-uid
      
      





IP (--source 10.1.30.42) , , 127.0.0.1 hosts. dmesg (dmesg | grep IPtables) ADB Shell.



, Xioami Redmi 3S Google Drive. - .



P.S. Android-, . , , — . .



P.P.S. Zyxel Keenetic Extra. Wi-Fi .



All Articles