Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΠ°Ρ€Ρ‚Π° ΠΌΡ‹ сообщали, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ ΡΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ запуска Π½Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² UC Browser. БСгодня Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΊΠ°ΠΊ эта Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° происходит ΠΈ ΠΊΠ°ΠΊ Ρ…Π°ΠΊΠ΅Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ Π² своих цСлях.

НСкотороС врСмя Π½Π°Π·Π°Π΄ UC Browser Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΈ распространяли ΠΎΡ‡Π΅Π½ΡŒ агрСссивно: Π΅Π³ΠΎ устанавливали Π½Π° устройства ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ врСдоносных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, распространяли с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сайтов ΠΏΠΎΠ΄ Π²ΠΈΠ΄ΠΎΠΌ Π²ΠΈΠ΄Π΅ΠΎΡ„Π°ΠΉΠ»ΠΎΠ² (Ρ‚. Π΅. ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄ΡƒΠΌΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ‡Π°ΡŽΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡ€Π½ΠΎΡ€ΠΎΠ»ΠΈΠΊ, Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ вмСсто Π½Π΅Π³ΠΎ APK с этим Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ), использовали ΠΏΡƒΠ³Π°ΡŽΡ‰ΠΈΠ΅ Π±Π°Π½Π½Π΅Ρ€Ρ‹ с сообщСниями ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ устарСл, уязвим ΠΈ всё Π² Ρ‚Π°ΠΊΠΎΠΌ Π΄ΡƒΡ…Π΅. Π’ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ UC Browser Π² VK Π΅ΡΡ‚ΡŒ Ρ‚Π΅ΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅Π΄ΠΎΠ±Ρ€ΠΎΡΠΎΠ²Π΅ΡΡ‚Π½ΡƒΡŽ Ρ€Π΅ΠΊΠ»Π°ΠΌΡƒ, Ρ‚Π°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Π’ 2016 Π³ΠΎΠ΄Ρƒ Π±Ρ‹Π»Π° Π΄Π°ΠΆΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΊΠ»Π°ΠΌΠ° Π½Π° русском языкС (Π΄Π°, Ρ€Π΅ΠΊΠ»Π°ΠΌΠ° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΊΠ»Π°ΠΌΡƒ).

На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρƒ UC Browser Π½Π°Π±Ρ€Π°Π»ΠΎΡΡŒ Π±ΠΎΠ»Π΅Π΅ 500 000 000 установок Π² Google Play. Π­Ρ‚ΠΎ впСчатляСт β€” большС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ Google Chrome. Π‘Ρ€Π΅Π΄ΠΈ ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ достаточно ΠΌΠ½ΠΎΠ³ΠΎ ΠΆΠ°Π»ΠΎΠ± Π½Π° Ρ€Π΅ΠΊΠ»Π°ΠΌΡƒ ΠΈ Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Ρ‹ Π½Π° ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ прилоТСния Π² Google Play. Π­Ρ‚ΠΎ ΠΈ стало ΠΏΠΎΠ²ΠΎΠ΄ΠΎΠΌ ΠΊ исслСдованию: ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π»ΠΈ UC Browser Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅. И оказалось, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈ Π΄Π΅Π»Π°Π΅Ρ‚!

Π’ ΠΊΠΎΠ΄Π΅ прилоТСния ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π°ΡΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ запуска исполняСмого ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Google Play. Помимо Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ UC Browser Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ исполняСмый ΠΊΠΎΠ΄, ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ это нСбСзопасно, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для провСдСния MitM-Π°Ρ‚Π°ΠΊΠΈ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, получится Π»ΠΈ Ρƒ нас Ρ‚Π°ΠΊΡƒΡŽ Π°Ρ‚Π°ΠΊΡƒ провСсти.

Всё, Ρ‡Ρ‚ΠΎ написано Π΄Π°Π»Π΅Π΅, Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для вСрсии UC Browser, которая присутствовала Π² Google Play Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ провСдСния исслСдования:

package: com.UCMobile.intl
versionName: 12.10.8.1172
versionCode: 10598
sha1 APK-Ρ„Π°ΠΉΠ»Π°: f5edb2243413c777172f6362876041eb0c3a928c

Π’Π΅ΠΊΡ‚ΠΎΡ€ Π°Ρ‚Π°ΠΊΠΈ

Π’ манифСстС UC Browser ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ сСрвис с говорящим Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ com.uc.deployment.UpgradeDeployService.

    <service android_exported="false" android_name="com.uc.deployment.UpgradeDeployService" android_process=":deploy" />

ΠŸΡ€ΠΈ запускС этого сСрвиса Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ выполняСт POST-запрос ΠΊ puds.ucweb.com/upgrade/index.xhtml, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя послС старта. Π’ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ обновлСния ΠΈΠ»ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ модуля. Π’ процСссС Π°Π½Π°Π»ΠΈΠ·Π° сСрвСр Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π΅ Π΄Π°Π²Π°Π», Π½ΠΎ ΠΌΡ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ PDF Ρ‚ΠΎΡ‚ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ запрос ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅ адрСсу, послС Ρ‡Π΅Π³ΠΎ скачиваСт Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. Для провСдСния Π°Ρ‚Π°ΠΊΠΈ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ UC Browser: ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ PDF с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Ρ‚ Π² APK ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΏΡ€ΠΈ нСобходимости ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈΠ· Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ тСорСтичСски UC Browser ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΈ Π±Π΅Π· взаимодСйствия с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ – Ссли ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ сформированный ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся послС запуска Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Но для этого Π½ΡƒΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» взаимодСйствия с сСрвСром, поэтому ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PDF.

Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ PDF прямо Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ запросы:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΈΠ΄Ρ‘Ρ‚ POST-запрос ΠΊ puds.ucweb.com/upgrade/index.xhtml, послС Ρ‡Π΅Π³ΠΎ
скачиваСтся Π°Ρ€Ρ…ΠΈΠ² с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ для просмотра PDF ΠΈ офисных Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ². Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ запросС пСрСдаётся информация ΠΎ систСмС (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ), Π° Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° Π½Π΅Π³ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ: адрСс ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ запрос этот Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½.

Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ запроса

Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π‘Π°ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π° Π² ZIP ΠΈ Π½Π΅ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π°.

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Поиск ΠΊΠΎΠ΄Π° Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠΎΠ΄ класса com.uc.deployment.UpgradeDeployService: ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° onStartCommand ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² com.uc.deployment.b.x, Π° ΠΈΠ· Π½Π΅Π³ΠΎ Π² com.uc.browser.core.d.c.f.e:

    public final void e(l arg9) {
int v4_5;
String v3_1;
byte[] v3;
byte[] v1 = null;
if(arg9 == null) {
v3 = v1;
}
else {
v3_1 = arg9.iGX.ipR;
StringBuilder v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]product:");
v4.append(arg9.iGX.ipR);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]version:");
v4.append(arg9.iGX.iEn);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]upgrade_type:");
v4.append(arg9.iGX.mMode);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]force_flag:");
v4.append(arg9.iGX.iEo);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_mode:");
v4.append(arg9.iGX.iDQ);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_type:");
v4.append(arg9.iGX.iEr);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_state:");
v4.append(arg9.iGX.iEp);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_file:");
v4.append(arg9.iGX.iEq);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apk_md5:");
v4.append(arg9.iGX.iEl);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_type:");
v4.append(arg9.mDownloadType);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_group:");
v4.append(arg9.mDownloadGroup);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_path:");
v4.append(arg9.iGH);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_child_version:");
v4.append(arg9.iGX.iEx);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_series:");
v4.append(arg9.iGX.iEw);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_arch:");
v4.append(arg9.iGX.iEt);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp3:");
v4.append(arg9.iGX.iEv);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp:");
v4.append(arg9.iGX.iEu);
ArrayList v3_2 = arg9.iGX.iEz;
if(v3_2 != null && v3_2.size() != 0) {
Iterator v3_3 = v3_2.iterator();
while(v3_3.hasNext()) {
Object v4_1 = v3_3.next();
StringBuilder v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_name:");
v5.append(((au)v4_1).getName());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_name:");
v5.append(((au)v4_1).aDA());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_code:");
v5.append(((au)v4_1).gBl);
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_req_type:");
v5.append(((au)v4_1).gBq);
}
}
j v3_4 = new j();
m.b(v3_4);
h v4_2 = new h();
m.b(v4_2);
ay v5_1 = new ay();
v3_4.hS("");
v3_4.setImsi("");
v3_4.hV("");
v5_1.bPQ = v3_4;
v5_1.bPP = v4_2;
v5_1.yr(arg9.iGX.ipR);
v5_1.gBF = arg9.iGX.mMode;
v5_1.gBI = arg9.iGX.iEz;
v3_2 = v5_1.gAr;
c.aBh();
v3_2.add(g.fs("os_ver", c.getRomInfo()));
v3_2.add(g.fs("processor_arch", com.uc.b.a.a.c.getCpuArch()));
v3_2.add(g.fs("cpu_arch", com.uc.b.a.a.c.Pb()));
String v4_3 = com.uc.b.a.a.c.Pd();
v3_2.add(g.fs("cpu_vfp", v4_3));
v3_2.add(g.fs("net_type", String.valueOf(com.uc.base.system.a.Jo())));
v3_2.add(g.fs("fromhost", arg9.iGX.iEm));
v3_2.add(g.fs("plugin_ver", arg9.iGX.iEn));
v3_2.add(g.fs("target_lang", arg9.iGX.iEs));
v3_2.add(g.fs("vitamio_cpu_arch", arg9.iGX.iEt));
v3_2.add(g.fs("vitamio_vfp", arg9.iGX.iEu));
v3_2.add(g.fs("vitamio_vfp3", arg9.iGX.iEv));
v3_2.add(g.fs("plugin_child_ver", arg9.iGX.iEx));
v3_2.add(g.fs("ver_series", arg9.iGX.iEw));
v3_2.add(g.fs("child_ver", r.aVw()));
v3_2.add(g.fs("cur_ver_md5", arg9.iGX.iEl));
v3_2.add(g.fs("cur_ver_signature", SystemHelper.getUCMSignature()));
v3_2.add(g.fs("upgrade_log", i.bjt()));
v3_2.add(g.fs("silent_install", String.valueOf(arg9.iGX.iDQ)));
v3_2.add(g.fs("silent_state", String.valueOf(arg9.iGX.iEp)));
v3_2.add(g.fs("silent_file", arg9.iGX.iEq));
v3_2.add(g.fs("silent_type", String.valueOf(arg9.iGX.iEr)));
v3_2.add(g.fs("cpu_archit", com.uc.b.a.a.c.Pc()));
v3_2.add(g.fs("cpu_set", SystemHelper.getCpuInstruction()));
boolean v4_4 = v4_3 == null || !v4_3.contains("neon") ? false : true;
v3_2.add(g.fs("neon", String.valueOf(v4_4)));
v3_2.add(g.fs("cpu_cores", String.valueOf(com.uc.b.a.a.c.Jl())));
v3_2.add(g.fs("ram_1", String.valueOf(com.uc.b.a.a.h.Po())));
v3_2.add(g.fs("totalram", String.valueOf(com.uc.b.a.a.h.OL())));
c.aBh();
v3_2.add(g.fs("rom_1", c.getRomInfo()));
v4_5 = e.getScreenWidth();
int v6 = e.getScreenHeight();
StringBuilder v7 = new StringBuilder();
v7.append(v4_5);
v7.append("*");
v7.append(v6);
v3_2.add(g.fs("ss", v7.toString()));
v3_2.add(g.fs("api_level", String.valueOf(Build$VERSION.SDK_INT)));
v3_2.add(g.fs("uc_apk_list", SystemHelper.getUCMobileApks()));
Iterator v4_6 = arg9.iGX.iEA.entrySet().iterator();
while(v4_6.hasNext()) {
Object v6_1 = v4_6.next();
v3_2.add(g.fs(((Map$Entry)v6_1).getKey(), ((Map$Entry)v6_1).getValue()));
}
v3 = v5_1.toByteArray();
}
if(v3 == null) {
this.iGY.iGI.a(arg9, "up_encode", "yes", "fail");
return;
}
v4_5 = this.iGY.iGw ? 0x1F : 0;
if(v3 == null) {
}
else {
v3 = g.i(v4_5, v3);
if(v3 == null) {
}
else {
v1 = new byte[v3.length + 16];
byte[] v6_2 = new byte[16];
Arrays.fill(v6_2, 0);
v6_2[0] = 0x5F;
v6_2[1] = 0;
v6_2[2] = ((byte)v4_5);
v6_2[3] = -50;
System.arraycopy(v6_2, 0, v1, 0, 16);
System.arraycopy(v3, 0, v1, 16, v3.length);
}
}
if(v1 == null) {
this.iGY.iGI.a(arg9, "up_encrypt", "yes", "fail");
return;
}
if(TextUtils.isEmpty(this.iGY.mUpgradeUrl)) {
this.iGY.iGI.a(arg9, "up_url", "yes", "fail");
return;
}
StringBuilder v0 = new StringBuilder("[");
v0.append(arg9.iGX.ipR);
v0.append("]url:");
v0.append(this.iGY.mUpgradeUrl);
com.uc.browser.core.d.c.i v0_1 = this.iGY.iGI;
v3_1 = this.iGY.mUpgradeUrl;
com.uc.base.net.e v0_2 = new com.uc.base.net.e(new com.uc.browser.core.d.c.i$a(v0_1, arg9));
v3_1 = v3_1.contains("?") ? v3_1 + "&dataver=pb" : v3_1 + "?dataver=pb";
n v3_5 = v0_2.uc(v3_1);
m.b(v3_5, false);
v3_5.setMethod("POST");
v3_5.setBodyProvider(v1);
v0_2.b(v3_5);
this.iGY.iGI.a(arg9, "up_null", "yes", "success");
this.iGY.iGI.b(arg9);
}

Π’ΠΈΠ΄ΠΈΠΌ Ρ‚ΡƒΡ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ POST-запроса. ΠžΠ±Ρ€Π°Ρ‰Π°Π΅ΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° созданиС массива ΠΈΠ· 16 Π±Π°ΠΉΡ‚ ΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: 0x5F, 0, 0x1F, -50 (=0xCE). Π‘ΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² запросС Π²Ρ‹ΡˆΠ΅.

Π’ этом ΠΆΠ΅ классС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ класс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ интСрСсный ΠΌΠ΅Ρ‚ΠΎΠ΄:

        public final void a(l arg10, byte[] arg11) {
f v0 = this.iGQ;
StringBuilder v1 = new StringBuilder("[");
v1.append(arg10.iGX.ipR);
v1.append("]:UpgradeSuccess");
byte[] v1_1 = null;
if(arg11 == null) {
}
else if(arg11.length < 16) {
}
else {
if(arg11[0] != 0x60 && arg11[3] != 0xFFFFFFD0) {
goto label_57;
}
int v3 = 1;
int v5 = arg11[1] == 1 ? 1 : 0;
if(arg11[2] != 1 && arg11[2] != 11) {
if(arg11[2] == 0x1F) {
}
else {
v3 = 0;
}
}
byte[] v7 = new byte[arg11.length - 16];
System.arraycopy(arg11, 16, v7, 0, v7.length);
if(v3 != 0) {
v7 = g.j(arg11[2], v7);
}
if(v7 == null) {
goto label_57;
}
if(v5 != 0) {
v1_1 = g.P(v7);
goto label_57;
}
v1_1 = v7;
}
label_57:
if(v1_1 == null) {
v0.iGY.iGI.a(arg10, "up_decrypt", "yes", "fail");
return;
}
q v11 = g.b(arg10, v1_1);
if(v11 == null) {
v0.iGY.iGI.a(arg10, "up_decode", "yes", "fail");
return;
}
if(v0.iGY.iGt) {
v0.d(arg10);
}
if(v0.iGY.iGo != null) {
v0.iGY.iGo.a(0, ((o)v11));
}
if(v0.iGY.iGs) {
v0.iGY.a(((o)v11));
v0.iGY.iGI.a(v11, "up_silent", "yes", "success");
v0.iGY.iGI.a(v11);
return;
}
v0.iGY.iGI.a(v11, "up_silent", "no", "success");
}
}

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ массив Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ провСряСт, Ρ‡Ρ‚ΠΎ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚ Ρ€Π°Π²Π΅Π½ 0x60 ΠΈΠ»ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π±Π°ΠΉΡ‚ Ρ€Π°Π²Π΅Π½ 0xD0, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π°ΠΉΡ‚ β€” 1, 11 ΠΈΠ»ΠΈ 0x1F. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ сСрвСра: Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±Π°ΠΉΡ‚ β€” 0x60, Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” 0x1F, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ β€” 0x60. ΠŸΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. Будя ΠΏΠΎ строчкам (Β«up_decryptΒ», Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€), Ρ‚ΡƒΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΡƒΠ΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра.
ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ g.j. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Π½Π΅Π³ΠΎ пСрСдаётся Π±Π°ΠΉΡ‚ ΠΏΠΎ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ 2 (Ρ‚. Π΅. 0x1F Π² нашСм случаС), Π° Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ β€” ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра Π±Π΅Π·
ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 16 Π±Π°ΠΉΡ‚.

     public static byte[] j(int arg1, byte[] arg2) {
if(arg1 == 1) {
arg2 = c.c(arg2, c.adu);
}
else if(arg1 == 11) {
arg2 = m.aF(arg2);
}
else if(arg1 != 0x1F) {
}
else {
arg2 = EncryptHelper.decrypt(arg2);
}
return arg2;
}

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‚ΡƒΡ‚ происходит Π²Ρ‹Π±ΠΎΡ€ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ, ΠΈ Ρ‚ΠΎΡ‚ самый Π±Π°ΠΉΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² нашСм
случаС Ρ€Π°Π²Π΅Π½ 0x1F, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π°. ПослС ΠΏΠ°Ρ€Ρ‹ ΠΏΡ€Ρ‹ΠΆΠΊΠΎΠ² ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ с говорящим Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ decryptBytesByKey.

Π’ΡƒΡ‚ ΠΎΡ‚ нашСго ΠΎΡ‚Π²Π΅Ρ‚Π° отдСляСтся Π΅Ρ‰Ρ‘ Π΄Π²Π° Π±Π°ΠΉΡ‚Π°, ΠΈ ΠΈΠ· Π½ΠΈΡ… получаСтся строка. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠΌ способом выбираСтся ΠΊΠ»ΡŽΡ‡ для Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ сообщСния.

    private static byte[] decryptBytesByKey(byte[] bytes) {
byte[] v0 = null;
if(bytes != null) {
try {
if(bytes.length < EncryptHelper.PREFIX_BYTES_SIZE) {
}
else if(bytes.length == EncryptHelper.PREFIX_BYTES_SIZE) {
return v0;
}
else {
byte[] prefix = new byte[EncryptHelper.PREFIX_BYTES_SIZE];  // 2 Π±Π°ΠΉΡ‚Π°
System.arraycopy(bytes, 0, prefix, 0, prefix.length);
String keyId = c.ayR().d(ByteBuffer.wrap(prefix).getShort()); // Π’Ρ‹Π±ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Π°
if(keyId == null) {
return v0;
}
else {
a v2 = EncryptHelper.ayL();
if(v2 == null) {
return v0;
}
else {
byte[] enrypted = new byte[bytes.length - EncryptHelper.PREFIX_BYTES_SIZE];
System.arraycopy(bytes, EncryptHelper.PREFIX_BYTES_SIZE, enrypted, 0, enrypted.length);
return v2.l(keyId, enrypted);
}
}
}
}
catch(SecException v7_1) {
EncryptHelper.handleDecryptException(((Throwable)v7_1), v7_1.getErrorCode());
return v0;
}
catch(Throwable v7) {
EncryptHelper.handleDecryptException(v7, 2);
return v0;
}
}
return v0;
}

ЗабСгая Π²ΠΏΠ΅Ρ€Ρ‘Π΄, ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° этом этапС получаСтся Π΅Ρ‰Ρ‘ Π½Π΅ ΠΊΠ»ΡŽΡ‡, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Β«ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Β». Π‘ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π° всё Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΊ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ добавляСтся Π΅Ρ‰Ρ‘ Π΄Π²Π°, ΠΈ ΠΈΡ… становится Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅: волшСбноС число 16, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Π°, Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ нСпонятная строка (Π² нашСм случаС пустая).

    public final byte[] l(String keyId, byte[] encrypted) throws SecException {
return this.ayJ().staticBinarySafeDecryptNoB64(16, keyId, encrypted, "");
}

ПослС сСрии ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ staticBinarySafeDecryptNoB64 интСрфСйса com.alibaba.wireless.security.open.staticdataencrypt.IStaticDataEncryptComponent. Π’ основном ΠΊΠΎΠ΄Π΅ прилоТСния Π½Π΅Ρ‚ классов, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… этот интСрфСйс. Π’Π°ΠΊΠΎΠΉ класс Π΅ΡΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π΅ lib/armeabi-v7a/libsgmain.so, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ .so, Π° .jar. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΉ нас ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

package com.alibaba.wireless.security.a.i;
// ...
public class a implements IStaticDataEncryptComponent {
private ISecurityGuardPlugin a;
// ...
private byte[] a(int mode, int magicInt, int xzInt, String keyId, byte[] encrypted, String magicString) {
return this.a.getRouter().doCommand(10601, new Object[]{Integer.valueOf(mode), Integer.valueOf(magicInt), Integer.valueOf(xzInt), keyId, encrypted, magicString});
}
// ...
private byte[] b(int magicInt, String keyId, byte[] encrypted, String magicString) {
return this.a(2, magicInt, 0, keyId, encrypted, magicString);
}
// ...
public byte[] staticBinarySafeDecryptNoB64(int magicInt, String keyId, byte[] encrypted, String magicString) throws SecException {
if(keyId != null && keyId.length() > 0 && magicInt >= 0 && magicInt < 19 && encrypted != null && encrypted.length > 0) {
return this.b(magicInt, keyId, encrypted, magicString);
}
throw new SecException("", 301);
}
//...
}

Π’ΡƒΡ‚ наш список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² дополняСтся Π΅Ρ‰Ρ‘ двумя Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами: 2 ΠΈ 0. Будя ΠΏΠΎ
всСму, 2 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΡƒ, ΠΊΠ°ΠΊ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ doFinal систСмного класса javax.crypto.Cipher. И всё это пСрСдаётся Π² Π½Π΅ΠΊΠΈΠΉ Router с числом 10601 β€” это, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

ПослС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс IRouterComponent ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ doCommand:

package com.alibaba.wireless.security.mainplugin;
import com.alibaba.wireless.security.framework.IRouterComponent;
import com.taobao.wireless.security.adapter.JNICLibrary;
public class a implements IRouterComponent {
public a() {
super();
}
public Object doCommand(int arg2, Object[] arg3) {
return JNICLibrary.doCommandNative(arg2, arg3);
}
}

А Ρ‚Π°ΠΊΠΆΠ΅ класс JNICLibrary, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ объявлСн Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ doCommandNative:

package com.taobao.wireless.security.adapter;
public class JNICLibrary {
public static native Object doCommandNative(int arg0, Object[] arg1);
}

Π—Π½Π°Ρ‡ΠΈΡ‚, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π² Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ doCommandNative. И Ρ‚ΡƒΡ‚ начинаСтся самоС вСсСльС.

ΠžΠ±Ρ„ΡƒΡΠΊΠ°Ρ†ΠΈΡ машинного ΠΊΠΎΠ΄Π°

Π’ Ρ„Π°ΠΉΠ»Π΅ libsgmain.so (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ .jar ΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Ρ‡ΡƒΡ‚ΡŒ Π²Ρ‹ΡˆΠ΅ нашли Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… интСрфСйсов, связанных с ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ) Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° нативная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°: libsgmainso-6.4.36.so. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΅Ρ‘ Π² IDA ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΡƒΡ‡Ρƒ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ с ошибками. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π° сСкций (section header table) – нСвалидная. Π­Ρ‚ΠΎ сдСлано ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·.

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Но ΠΎΠ½Π° ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Π°: Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ELF-Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π²ΠΏΠΎΠ»Π½Π΅ достаточно Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ сСгмСнтов (program header table). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ просто удаляСм Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ сСкций, зануляя ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅.

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π‘Π½ΠΎΠ²Π° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» Π² IDA.

Π•ΡΡ‚ΡŒ Π΄Π²Π° способа ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Java-машинС, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ находится рСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, объявлСнного Π² Java-ΠΊΠΎΠ΄Π΅ ΠΊΠ°ΠΊ native. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ β€” Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ имя Π²ΠΈΠ΄Π° Java_имя_ΠΏΠ°ΠΊΠ΅Ρ‚Π°_ИмяКласса_ΠΈΠΌΡΠœΠ΅Ρ‚ΠΎΠ΄Π°.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ β€” Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JNI_OnLoad)
с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RegisterNatives.

Π’ нашСм случаС, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ способ, имя Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ: Java_com_taobao_wireless_security_adapter_JNICLibrary_doCommandNative.

Π‘Ρ€Π΅Π΄ΠΈ экспортируСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΎΠΉ Π½Π΅Ρ‚, Π·Π½Π°Ρ‡ΠΈΡ‚, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² RegisterNatives.
Π˜Π΄Ρ‘ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ JNI_OnLoad ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π§Ρ‚ΠΎ Ρ‚ΡƒΡ‚ происходит? На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ARM. ΠŸΠ΅Ρ€Π²ΠΎΠΉ инструкциСй Π² стСк сохраняСтся содСрТимоС рСгистров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ функция Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС R0, R1 ΠΈ R2), Π° Ρ‚Π°ΠΊΠΆΠ΅ содСрТимоС рСгистра LR, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ПослСднСй инструкциСй сохранённыС рСгистры Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° сразу помСщаСтся Π² рСгистр PC β€” Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ происходит Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Но Ссли ΠΏΡ€ΠΈΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ прСдпослСдняя инструкция измСняСт адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, сохранённый Π² стСкС. Вычислим, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ послС
выполнСния ΠΊΠΎΠ΄Π°. Π’ R1 загруТаСтся Π½Π΅ΠΊΠΈΠΉ адрСс 0xB130, ΠΈΠ· Π½Π΅Π³ΠΎ вычитаСтся 5, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ пСрСкладываСтся Π² R0 ΠΈ ΠΊ Π½Π΅ΠΌΡƒ прибавляСтся 0x10. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ 0xB13B. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, IDA Π΄ΡƒΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² послСднСй инструкции происходит ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π½Π° самом Π΄Π΅Π»Π΅ происходит ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ вычислСнному адрСсу 0xB13B.

Π’ΡƒΡ‚ стоит Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ процСссоров ARM Π΅ΡΡ‚ΡŒ Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈ Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° инструкций: ARM ΠΈ Thumb. Младший Π±ΠΈΡ‚ адрСса Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ процСссору, ΠΊΠ°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€ инструкций ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. Π’. Π΅. адрСс Π½Π° самом Π΄Π΅Π»Π΅ 0xB13A, Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Π² младшСм Π±ΠΈΡ‚Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ Thumb.

Π’ Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Β«ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π½ΠΈΠΊΒ» ΠΈ
мусорный ΠΊΠΎΠ΄. Π”Π°Π»Π΅Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° Π½ΠΈΡ… ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ – просто ΠΏΠΎΠΌΠ½ΠΈΠΌ,
Ρ‡Ρ‚ΠΎ настоящСС Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ находится Ρ‡ΡƒΡ‚ΡŒ дальшС.

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΊΠΎΠ΄Π΅ Π½Π΅Ρ‚ явного ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° 0xB13A, IDA сама Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Π»Π°, Ρ‡Ρ‚ΠΎ Π² этом мСстС находится ΠΊΠΎΠ΄. По этой ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΎΠ½Π° Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Ρ‘Ρ‚ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎ нСсколько затрудняСт Π°Π½Π°Π»ΠΈΠ·. Π“ΠΎΠ²ΠΎΡ€ΠΈΠΌ IDA, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ ΠΊΠΎΠ΄, ΠΈ Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ получаСтся:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

На 0xB144 явно начинаСтся Ρ‚Π°Π±Π»ΠΈΡ†Π°. А Ρ‡Ρ‚ΠΎ Π² sub_494C?

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² рСгистрС LR ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ адрСс упомянутой Ρ€Π°Π½Π΅Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ (0xB144). Π’ R0 β€” индСкс Π² этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Π’. Π΅. бСрётся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, прибавляСтся ΠΊ LR ΠΈ получаСтся
адрСс, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ: 0xB144 + [0xB144 + 8* 4] = 0xB144 + 0x120 = 0xB264. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌΡƒ адрСсу ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΏΠ°Ρ€Ρƒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… инструкций ΠΈ ΠΎΠΏΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° 0xB140:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ с индСксом 0x20 ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Будя ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² Π² ΠΊΠΎΠ΄Π΅ встрСтится ΠΌΠ½ΠΎΠ³ΠΎ. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΊΠ°ΠΊ-Ρ‚ΠΎ с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ, Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ вычислСния адрСсов. И Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π½Π°ΠΌ приходят скрипты ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π² IDA:

def put_unconditional_branch(source, destination):
offset = (destination - source - 4) >> 1
if offset > 2097151 or offset < -2097152:
raise RuntimeError("Invalid offset")
if offset > 1023 or offset < -1024:
instruction1 = 0xf000 | ((offset >> 11) & 0x7ff)
instruction2 = 0xb800 | (offset & 0x7ff)
patch_word(source, instruction1)
patch_word(source + 2, instruction2)
else:
instruction = 0xe000 | (offset & 0x7ff)
patch_word(source, instruction)
ea = here()
if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR}
ea1 = ea + 2
if get_wide_word(ea1) == 0xbf00: #NOP
ea1 += 2
if get_operand_type(ea1, 0) == 1 and get_operand_value(ea1, 0) == 0 and get_operand_type(ea1, 1) == 2:
index = get_wide_dword(get_operand_value(ea1, 1))
print "index =", hex(index)
ea1 += 2
if get_operand_type(ea1, 0) == 7:
table = get_operand_value(ea1, 0) + 4
elif get_operand_type(ea1, 1) == 2:
table = get_operand_value(ea1, 1) + 4
else:
print "Wrong operand type on", hex(ea1), "-", get_operand_type(ea1, 0), get_operand_type(ea1, 1)
table = None
if table is None:
print "Unable to find table"
else:
print "table =", hex(table)
offset = get_wide_dword(table + (index << 2))
put_unconditional_branch(ea, table + offset)
else:
print "Unknown code", get_operand_type(ea1, 0), get_operand_value(ea1, 0), get_operand_type(ea1, 1) == 2
else:
print "Unable to detect first instruction"

Π‘Ρ‚Π°Π²ΠΈΠΌ курсор Π½Π° строчку 0xB26A, запускаСм скрипт ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° 0xB4B0:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

IDA ΠΎΠΏΡΡ‚ΡŒ Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Π»Π° этот участок ΠΊΠ°ΠΊ ΠΊΠΎΠ΄. ПомогаСм Π΅ΠΉ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΌ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ послС BLX выглядят Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ осмыслСнными, это большС ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ смСщСниС. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π² sub_4964:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΡƒΡ‚ бСрётся dword ΠΏΠΎ адрСсу, Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΌΡƒ Π² LR, прибавляСтся ΠΊ этому адрСсу, послС Ρ‡Π΅Π³ΠΎ бСрётся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌΡƒ адрСсу ΠΈ кладётся Π² стСк. Π’Π°ΠΊΠΆΠ΅ ΠΊ LR прибавляСтся 4, Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΡΠΊΠΎΡ‡ΠΈΡ‚ΡŒ это самоС смСщСниС. ПослС Ρ‡Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° POP {R1} достаёт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· стСка. Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ находится ΠΏΠΎ адрСсу 0xB4BA + 0xEA = 0xB5A4, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ адрСсов:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡ΠΈΡ‚ΡŒ эту ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, потрСбуСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΠ· ΠΊΠΎΠ΄Π°: смСщСниС ΠΈ Π½ΠΎΠΌΠ΅Ρ€ рСгистра, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ рСгистра придётся Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ кусочСк ΠΊΠΎΠ΄Π°.

patches = {}
patches[0] = (0x00, 0xbf, 0x01, 0x48, 0x00, 0x68, 0x02, 0xe0)
patches[1] = (0x00, 0xbf, 0x01, 0x49, 0x09, 0x68, 0x02, 0xe0)
patches[2] = (0x00, 0xbf, 0x01, 0x4a, 0x12, 0x68, 0x02, 0xe0)
patches[3] = (0x00, 0xbf, 0x01, 0x4b, 0x1b, 0x68, 0x02, 0xe0)
patches[4] = (0x00, 0xbf, 0x01, 0x4c, 0x24, 0x68, 0x02, 0xe0)
patches[5] = (0x00, 0xbf, 0x01, 0x4d, 0x2d, 0x68, 0x02, 0xe0)
patches[8] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x80, 0xd8, 0xf8, 0x00, 0x80, 0x01, 0xe0)
patches[9] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x90, 0xd9, 0xf8, 0x00, 0x90, 0x01, 0xe0)
patches[10] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xa0, 0xda, 0xf8, 0x00, 0xa0, 0x01, 0xe0)
patches[11] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xb0, 0xdb, 0xf8, 0x00, 0xb0, 0x01, 0xe0)
ea = here()
if (get_wide_word(ea) == 0xb082 #SUB SP, SP, #8
and get_wide_word(ea + 2) == 0xb503): #PUSH {R0,R1,LR}
if get_operand_type(ea + 4, 0) == 7:
pop = get_bytes(ea + 12, 4, 0)
if pop[1] == 'xbc':
register = -1
r = get_wide_byte(ea + 12)
for i in range(8):
if r == (1 << i):
register = i
break
if register == -1:
print "Unable to detect register"
else:
address = get_wide_dword(ea + 8) + ea + 8
for b in patches[register]:
patch_byte(ea, b)
ea += 1
if ea % 4 != 0:
ea += 2
patch_dword(ea, address)
elif pop[:3] == 'x5dxf8x04':
register = ord(pop[3]) >> 4
if register in patches:
address = get_wide_dword(ea + 8) + ea + 8
for b in patches[register]:
patch_byte(ea, b)
ea += 1
patch_dword(ea, address)
else:
print "POP instruction not found"
else:
print "Wrong operand type on +4:", get_operand_type(ea + 4, 0)
else:
print "Unable to detect first instructions"

Π‘Ρ‚Π°Π²ΠΈΠΌ курсор Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ конструкции, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ β€” 0xB4B2 β€” ΠΈ запускаСм скрипт:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Помимо ΡƒΠΆΠ΅ Π½Π°Π·Π²Π°Π½Π½Ρ‹Ρ… конструкций Π² ΠΊΠΎΠ΄Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ΡΡ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠ΅:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ случаС, послС инструкции BLX ΠΈΠ΄Ρ‘Ρ‚ смСщСниС:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π‘Π΅Ρ€Ρ‘ΠΌ смСщСниС ΠΏΠΎ адрСсу ΠΈΠ· LR, прибавляСм Π΅Π³ΠΎ ΠΊ LR ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Ρ‚ΡƒΠ΄Π°. 0x72044 + 0xC = 0x72050. Π‘ΠΊΡ€ΠΈΠΏΡ‚ для этой конструкции совсСм простой:

def put_unconditional_branch(source, destination):
offset = (destination - source - 4) >> 1
if offset > 2097151 or offset < -2097152:
raise RuntimeError("Invalid offset")
if offset > 1023 or offset < -1024:
instruction1 = 0xf000 | ((offset >> 11) & 0x7ff)
instruction2 = 0xb800 | (offset & 0x7ff)
patch_word(source, instruction1)
patch_word(source + 2, instruction2)
else:
instruction = 0xe000 | (offset & 0x7ff)
patch_word(source, instruction)
ea = here()
if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR}
ea1 = ea + 6
if get_wide_word(ea + 2) == 0xbf00: #NOP
ea1 += 2
offset = get_wide_dword(ea1)
put_unconditional_branch(ea, (ea1 + offset) & 0xffffffff)
else:
print "Unable to detect first instruction"

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния скрипта:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всё ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡Π΅Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ IDA Π½Π° Π΅Ρ‘ настоящСС Π½Π°Ρ‡Π°Π»ΠΎ. Она собСрёт вСсь ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ кусочкам, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ HexRays.

Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° строк

ΠœΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с обфускациСй машинного ΠΊΠΎΠ΄Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ libsgmainso-6.4.36.so ΠΈΠ· UC Browser ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JNI_OnLoad.

int __fastcall real_JNI_OnLoad(JavaVM *vm)
{
int result; // r0
jclass clazz; // r0 MAPDST
int v4; // r0
JNIEnv *env; // r4
int v6; // [sp-40h] [bp-5Ch]
int v7; // [sp+Ch] [bp-10h]
v7 = *(_DWORD *)off_8AC00;
if ( !vm )
goto LABEL_39;
sub_7C4F4();
env = (JNIEnv *)sub_7C5B0(0);
if ( !env )
goto LABEL_39;
v4 = sub_72CCC();
sub_73634(v4);
sub_73E24(&unk_83EA6, &v6, 49);
clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6);
if ( clazz
&& (sub_9EE4(),
sub_71D68(env),
sub_E7DC(env) >= 0
&& sub_69D68(env) >= 0
&& sub_197B4(env, clazz) >= 0
&& sub_E240(env, clazz) >= 0
&& sub_B8B0(env, clazz) >= 0
&& sub_5F0F4(env, clazz) >= 0
&& sub_70640(env, clazz) >= 0
&& sub_11F3C(env) >= 0
&& sub_21C3C(env, clazz) >= 0
&& sub_2148C(env, clazz) >= 0
&& sub_210E0(env, clazz) >= 0
&& sub_41B58(env, clazz) >= 0
&& sub_27920(env, clazz) >= 0
&& sub_293E8(env, clazz) >= 0
&& sub_208F4(env, clazz) >= 0) )
{
result = (sub_B7B0(env, clazz) >> 31) | 0x10004;
}
else
{
LABEL_39:
result = -1;
}
return result;
}

Рассмотрим Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строчки:

  sub_73E24(&unk_83EA6, &v6, 49);
clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6);

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sub_73E24 явно происходит Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° ΠΈΠΌΠ΅Π½ΠΈ класса. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСдаётся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ Π½Π° Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅, Π½Π΅ΠΊΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΈ число. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Π°Ρ строчка, Ρ‚. ΠΊ. ΠΎΠ½ пСрСдаётся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ FindClass, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ имя класса. Π‘Ρ‚Π°Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ, число β€” это Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° ΠΈΠ»ΠΈ Π΄Π»ΠΈΠ½Π° строки. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ имя класса, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π°ΠΌ, Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Π»ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΌΡ‹ ΠΈΠ΄Ρ‘ΠΌ. Рассмотрим ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅, Ρ‡Ρ‚ΠΎ происходит Π² sub_73E24.

int __fastcall sub_73E56(unsigned __int8 *in, unsigned __int8 *out, size_t size)
{
int v4; // r6
int v7; // r11
int v8; // r9
int v9; // r4
size_t v10; // r5
int v11; // r0
struc_1 v13; // [sp+0h] [bp-30h]
int v14; // [sp+1Ch] [bp-14h]
int v15; // [sp+20h] [bp-10h]
v4 = 0;
v15 = *(_DWORD *)off_8AC00;
v14 = 0;
v7 = sub_7AF78(17);
v8 = sub_7AF78(size);
if ( !v7 )
{
v9 = 0;
goto LABEL_12;
}
(*(void (__fastcall **)(int, const char *, int))(v7 + 12))(v7, "DcO/lcK+h?m3c*q@", 16);
if ( !v8 )
{
LABEL_9:
v4 = 0;
goto LABEL_10;
}
v4 = 0;
if ( !in )
{
LABEL_10:
v9 = 0;
goto LABEL_11;
}
v9 = 0;
if ( out )
{
memset(out, 0, size);
v10 = size - 1;
(*(void (__fastcall **)(int, unsigned __int8 *, size_t))(v8 + 12))(v8, in, v10);
memset(&v13, 0, 0x14u);
v13.field_4 = 3;
v13.field_10 = v7;
v13.field_14 = v8;
v11 = sub_6115C(&v13, &v14);
v9 = v11;
if ( v11 )
{
if ( *(_DWORD *)(v11 + 4) == v10 )
{
qmemcpy(out, *(const void **)v11, v10);
v4 = *(_DWORD *)(v9 + 4);
}
else
{
v4 = 0;
}
goto LABEL_11;
}
goto LABEL_9;
}
LABEL_11:
sub_7B148(v7);
LABEL_12:
if ( v8 )
sub_7B148(v8);
if ( v9 )
sub_7B148(v9);
return v4;
}

Ѐункция sub_7AF78 создаёт экзСмпляр ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° для Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… массивов ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° этих ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…). Π’ΡƒΡ‚ создаётся Π΄Π²Π° Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°: Π² ΠΎΠ΄ΠΈΠ½ помСщаСтся строчка Β«DcO/lcK+h?m3c*q@Β» (Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ это ΠΊΠ»ΡŽΡ‡), Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Π”Π°Π»Π΅Π΅ ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π½Π΅ΠΊΡƒΡŽ структуру, которая пСрСдаётся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sub_6115C. Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Π² этой структурС ΠΏΠΎΠ»Π΅ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 3. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ происходит с этой структурой дальшС.

int __fastcall sub_611B4(struc_1 *a1, _DWORD *a2)
{
int v3; // lr
unsigned int v4; // r1
int v5; // r0
int v6; // r1
int result; // r0
int v8; // r0
*a2 = 820000;
if ( a1 )
{
v3 = a1->field_14;
if ( v3 )
{
v4 = a1->field_4;
if ( v4 < 0x19 )
{
switch ( v4 )
{
case 0u:
v8 = sub_6419C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 3u:
v8 = sub_6364C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 0x10u:
case 0x11u:
case 0x12u:
v8 = sub_612F4(
a1->field_0,
v4,
*(_QWORD *)&a1->field_8,
*(_QWORD *)&a1->field_8 >> 32,
a1->field_10,
v3,
a2);
goto LABEL_17;
case 0x14u:
v8 = sub_63A28(a1->field_0, v3);
goto LABEL_17;
case 0x15u:
sub_61A60(a1->field_0, v3, a2);
return result;
case 0x16u:
v8 = sub_62440(a1->field_14);
goto LABEL_17;
case 0x17u:
v8 = sub_6226C(a1->field_10, v3);
goto LABEL_17;
case 0x18u:
v8 = sub_63530(a1->field_14);
LABEL_17:
v6 = 0;
if ( v8 )
{
*a2 = 0;
v6 = v8;
}
return v6;
default:
LOWORD(v5) = 28032;
goto LABEL_5;
}
}
}
}
LOWORD(v5) = -27504;
LABEL_5:
HIWORD(v5) = 13;
v6 = 0;
*a2 = v5;
return v6;
}

Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° switch пСрСдаётся ΠΏΠΎΠ»Π΅ структуры, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ€Π°Π½Π΅Π΅ Π±Ρ‹Π»ΠΎ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ case 3: Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sub_6364C ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ· структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ слоТСны Ρ‚ΡƒΠ΄Π° Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚. Π΅. ΠΊΠ»ΡŽΡ‡ ΠΈ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Если Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° sub_6364C, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π² Π½Π΅ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ RC4.

Π£ нас Π΅ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΈ ΠΊΠ»ΡŽΡ‡. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ имя класса. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ: com/taobao/wireless/security/adapter/JNICLibrary. ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! ΠœΡ‹ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΡƒΡ‚ΠΈ.

Π”Π΅Ρ€Π΅Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π²Ρ‹Π·ΠΎΠ² RegisterNatives, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π°ΠΌ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ doCommandNative. ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΈΠ· JNI_OnLoad, ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π² sub_B7B0:

int __fastcall sub_B7F6(JNIEnv *env, jclass clazz)
{
char signature[41]; // [sp+7h] [bp-55h]
char name[16]; // [sp+30h] [bp-2Ch]
JNINativeMethod method; // [sp+40h] [bp-1Ch]
int v8; // [sp+4Ch] [bp-10h]
v8 = *(_DWORD *)off_8AC00;
decryptString((unsigned __int8 *)&unk_83ED9, (unsigned __int8 *)name, 0x10u);// doCommandNative
decryptString((unsigned __int8 *)&unk_83EEA, (unsigned __int8 *)signature, 0x29u);// (I[Ljava/lang/Object;)Ljava/lang/Object;
method.name = name;
method.signature = signature;
method.fnPtr = sub_B69C;
return ((int (__fastcall *)(JNIEnv *, jclass, JNINativeMethod *, int))(*env)->RegisterNatives)(env, clazz, &method, 1) >> 31;
}

И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΡƒΡ‚ рСгистрируСтся Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΈΠΌΠ΅Π½Π΅ΠΌ doCommandNative. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ Π΅Π³ΠΎ адрСс. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚.

int __fastcall doCommandNative(JNIEnv *env, jobject obj, int command, jarray args)
{
int v5; // r5
struc_2 *a5; // r6
int v9; // r1
int v11; // [sp+Ch] [bp-14h]
int v12; // [sp+10h] [bp-10h]
v5 = 0;
v12 = *(_DWORD *)off_8AC00;
v11 = 0;
a5 = (struc_2 *)malloc(0x14u);
if ( a5 )
{
a5->field_0 = 0;
a5->field_4 = 0;
a5->field_8 = 0;
a5->field_C = 0;
v9 = command % 10000 / 100;
a5->field_0 = command / 10000;
a5->field_4 = v9;
a5->field_8 = command % 100;
a5->field_C = env;
a5->field_10 = args;
v5 = sub_9D60(command / 10000, v9, command % 100, 1, (int)a5, &v11);
}
free(a5);
if ( !v5 && v11 )
sub_7CF34(env, v11, &byte_83ED7);
return v5;
}

По названию ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ здСсь находится Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ€Π΅ΡˆΠΈΠ»ΠΈ пСрСнСсти Π² Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. Нас интСрСсуСт функция с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 10601.

По ΠΊΠΎΠ΄Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ· Π½ΠΎΠΌΠ΅Ρ€Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ получаСтся Ρ‚Ρ€ΠΈ числа: command / 10000, command % 10000 / 100 ΠΈ command % 10, Ρ‚. Π΅., Π² нашСм случаС, 1, 6 ΠΈ 1. Π­Ρ‚ΠΈ Ρ‚Ρ€ΠΈ числа, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° JNIEnv ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² структуру ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ дальшС. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ‚Ρ€Ρ‘Ρ… чисСл (ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ ΠΈΡ… N1, N2 ΠΈ N3) строится Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π”Π΅Ρ€Π΅Π²ΠΎ заполняСтся динамичСски Π² JNI_OnLoad.
Π’Ρ€ΠΈ числа ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΡƒΡ‚ΡŒ Π² Π΄Π΅Ρ€Π΅Π²Π΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ лист Π΄Π΅Ρ€Π΅Π²Π° содСрТит поксорСнный адрСс ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠšΠ»ΡŽΡ‡ β€” Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ ΡƒΠ·Π»Π΅. Найти мСсто Π² ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ Π² Π΄Π΅Ρ€Π΅Π²ΠΎ добавляСтся нуТная Π½Π°ΠΌ функция, Π½Π΅ составляСт большого Ρ‚Ρ€ΡƒΠ΄Π°, Ссли Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π²ΠΎ всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… структурах (ΠΈΡ… описаниС Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ€Π°Π·Π΄ΡƒΠ²Π°Ρ‚ΡŒ ΠΈ Π±Π΅Π· Ρ‚ΠΎΠ³ΠΎ Π½Π΅ΠΌΠ°Π»Π΅Π½ΡŒΠΊΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ).

Π•Ρ‰Ρ‘ обфускация

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ адрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ: 0x5F1AC. Но Ρ€Π°Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠΊΠ° Ρ€Π°Π½ΠΎ: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ UC Browser ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ для нас Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΡΡŽΡ€ΠΏΡ€ΠΈΠ·.

ПослС получСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ· массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» сформирован Π² Java-ΠΊΠΎΠ΄Π΅, ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ
Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎ адрСсу 0x4D070. И Ρ‚ΡƒΡ‚ нас ΠΆΠ΄Ρ‘Ρ‚ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Π²ΠΈΠ΄ обфускации ΠΊΠΎΠ΄Π°.

ΠšΠ»Π°Π΄Ρ‘ΠΌ Π² R7 ΠΈ R4 Π΄Π²Π° индСкса:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

ΠŸΠ΅Ρ€Π΅ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ индСкс Π² R11:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСс ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ индСкс:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

ПослС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ адрСсу ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‚ΠΎΡ€ΠΎΠΉ индСкс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² R4. Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 230 элСмСнтов.

Π§Ρ‚ΠΎ с этим Π΄Π΅Π»Π°Ρ‚ΡŒ? МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ IDA, Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠΉ switch: Edit -> Other -> Specify switch idiom.

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΊΠΎΠ΄ ΡΡ‚Ρ€Π°ΡˆΠ΅Π½. Но, ΠΏΡ€ΠΎΠ±ΠΈΡ€Π°ΡΡΡŒ Ρ‡Π΅Ρ€Π΅Π· Π΅Π³ΠΎ Π΄Π΅Π±Ρ€ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ Π½Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sub_6115C:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π’Π°ΠΌ Π±Ρ‹Π» switch, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π² case 3 Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° с использованиСм Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° RC4. А Π² этом случаС пСрСдаваСмая Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ структура заполняСтся ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π² doCommandNative. ВспоминаСм, Ρ‡Ρ‚ΠΎ Ρƒ нас Ρ‚Π°ΠΌ Π±Ρ‹Π» magicInt со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 16. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ case – ΠΈ послС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊΠΎΠ΄, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π­Ρ‚ΠΎ AES!

Алгоритм Π΅ΡΡ‚ΡŒ, ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: Ρ€Π΅ΠΆΠΈΠΌ, ΠΊΠ»ΡŽΡ‡ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π΅Π³ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ зависит ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° AES). Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° с Π½ΠΈΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π³Π΄Π΅-Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sub_6115C, Π½ΠΎ эта Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° обфусцирована особСнно Ρ…ΠΎΡ€ΠΎΡˆΠΎ, поэтому Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ идСя ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ дампились Π² Ρ„Π°ΠΉΠ».

ΠŸΠ°Ρ‚Ρ‡

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ вСсь ΠΊΠΎΠ΄ ΠΏΠ°Ρ‚Ρ‡Π° Π½Π° языкС ассСмблСра Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Android Studio, Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠ°ΠΊ Ρƒ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ, ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚ Π² Ρ„Π°ΠΉΠ», послС Ρ‡Π΅Π³ΠΎ ΡΠΊΠΎΠΏΠΈΠΏΠ°ΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сгСнСрируСт компилятор.

Об удобствС добавлСния ΠΊΠΎΠ΄Π° наши Π΄Ρ€ΡƒΠ·ΡŒΡ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ UC Browser Ρ‚ΠΎΠΆΠ΅ Β«ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈΡΡŒΒ». ВспоминаСм, Ρ‡Ρ‚ΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρƒ нас мусорный ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ. ΠžΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ πŸ™‚ ΠŸΡ€Π°Π²Π΄Π°, Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ мСста для ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сохраняСт всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Ρ„Π°ΠΉΠ», ΠΌΠ°Π»ΠΎΠ²Π°Ρ‚ΠΎ. ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° части ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ мусорныС Π±Π»ΠΎΠΊΠΈ сосСдних Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ВсСго ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ части.

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π’ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ ARM ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· рСгистры R0-R3, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅, Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ β€” Ρ‡Π΅Ρ€Π΅Π· стСк. Π’ рСгистрС LR пСрСдаётся адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°. Всё это Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция ΠΌΠΎΠ³Π»Π° ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ сдампим Π΅Ρ‘ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π’Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС рСгистры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² процСссС, поэтому Π΄Π΅Π»Π°Π΅ΠΌ PUSH.W {R0-R10,LR}. Π’ R7 Ρƒ нас получаСтся адрСс списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· стСк.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fopen ΠΎΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ„Π°ΠΉΠ» /data/local/tmp/aes Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Β«abΒ»,
Ρ‚. Π΅. Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅. Π’ R0 Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ адрСс ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, Π² R1 β€” адрСс строки с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ°. И Ρ‚ΡƒΡ‚ мусорный ΠΊΠΎΠ΄ заканчиваСтся, поэтому ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π»Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ставим Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° настоящий ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΠ±Ρ…ΠΎΠ΄ мусора, Π° вмСсто мусора добавляСм ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ°Ρ‚Ρ‡Π°.

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ fopen.

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ aes ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ int. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π² Π½Π°Ρ‡Π°Π»Π΅ сохранили рСгистры Π² стСк, ΠΌΠΎΠΆΠ½ΠΎ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fwrite ΠΈΡ… адрСса Π² стСкС.

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π”Π°Π»ΡŒΡˆΠ΅ Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅ для ΠΊΠ»ΡŽΡ‡Π°, Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π’ ΠΊΠΎΠ½Ρ†Π΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ», восстанавливаСм рСгистры ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ настоящСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ aes.

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ APK с ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡Π΅Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, подписываСм, Π·Π°ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅ΠΌ Π½Π° устройство/эмулятор, запускаСм. Π’ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ наш Π΄Π°ΠΌΠΏ создаётся, ΠΈ Ρ‚ΡƒΠ΄Π° ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, ΠΈ всё ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ΄Ρ‘Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. А Π½ΡƒΠΆΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π½Π΅Ρ‚, ΠΈ Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ΅ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ запроса. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° UC Browser соизволит ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ запрос, Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ сСрвСра, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅, ΠΈ ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅Ρ‰Ρ‘ Ρ€Π°Π·: Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΡƒ Π² onCreate Π³Π»Π°Π²Π½ΠΎΠΉ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ‚ΠΈ.

    const/16 v1, 0x62
new-array v1, v1, [B
fill-array-data v1, :encrypted_data
const/16 v0, 0x1f
invoke-static {v0, v1}, Lcom/uc/browser/core/d/c/g;->j(I[B)[B
move-result-object v1
array-length v2, v1
invoke-static {v2}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v2
const-string v0, "ololo"
invoke-static {v0, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ, подписываСм, устанавливаСм, запускаСм. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ NullPointerException, Ρ‚. ΠΊ. ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π΅Ρ€Π½ΡƒΠ» null.

Π’ Ρ…ΠΎΠ΄Π΅ дальнСйшСго Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° Π±Ρ‹Π»Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° функция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ интСрСсныС строчки: Β«META-INF/Β» ΠΈ «.RSA». ΠŸΠΎΡ…ΠΎΠΆΠ΅, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ провСряСт свой сСртификат. Или Π΄Π°ΠΆΠ΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈΠ· Π½Π΅Π³ΠΎ. Π Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ происходит с сСртификатом, совсСм Π½Π΅ хочСтся, поэтому просто подсунСм Π΅ΠΌΡƒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ сСртификат. ΠŸΡ€ΠΎΠΏΠ°Ρ‚Ρ‡ΠΈΠΌ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строчку Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вмСсто Β«META-INF/Β» ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Β«BLABLINF/Β», создадим ΠΏΠ°ΠΏΠΊΡƒ с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π² APK ΠΈ ΠΏΠΎΠ΄ΠΊΠΈΠ½Π΅ΠΌ Ρ‚ΡƒΠ΄Π° сСртификат Π±Π΅Π»ΠΊΠΎΠ±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ, подписываСм, устанавливаСм, запускаСм. Π‘ΠΈΠ½Π³ΠΎ! ΠšΠ»ΡŽΡ‡ Ρƒ нас!

MitM

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ€Π°Π²Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡Ρƒ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ CBC.

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Π’ΠΈΠ΄ΠΈΠΌ URL Π°Ρ€Ρ…ΠΈΠ²Π°, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° MD5, Β«extract_unzipsizeΒ» ΠΈ число. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ: MD5 Π°Ρ€Ρ…ΠΈΠ²Π° совпадаСт, Ρ€Π°Π·ΠΌΠ΅Ρ€ распакованной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ совпадаСт. ΠŸΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡ΠΈΡ‚ΡŒ эту Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ Π΅Ρ‘ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ наша пропатчСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»Π°ΡΡŒ, Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Intent Π½Π° созданиС БМБ с тСкстом Β«PWNED!Β». ΠŸΠΎΠ΄ΠΌΠ΅Π½ΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π²Π° ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ сСрвСра: puds.ucweb.com/upgrade/index.xhtml ΠΈ Π½Π° скачиваниС Π°Ρ€Ρ…ΠΈΠ²Π°. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ подмСняСм MD5 (Ρ€Π°Π·ΠΌΠ΅Ρ€ послС распаковки Π½Π΅ мСняСтся), Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΡ‚Π΄Π°Ρ‘ΠΌ Π°Ρ€Ρ…ΠΈΠ² с ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡Π΅Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ.

Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ нСсколько Ρ€Π°Π· пытаСтся ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΠ², послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π’ΠΈΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ
Π΅ΠΌΡƒ Π½Π΅ нравится. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π°Π½Π°Π»ΠΈΠ·Π° этого ΠΌΡƒΡ‚Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ сСрвСр ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π΅Ρ‰Ρ‘ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π°Ρ€Ρ…ΠΈΠ²Π°:

Π˜Ρ‰Π΅ΠΌ уязвимости Π² UC Browser

Он Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ Π² LEB128. ПослС ΠΏΠ°Ρ‚Ρ‡Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π°Ρ€Ρ…ΠΈΠ²Π° с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ измСнился, поэтому Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ посчитал, Ρ‡Ρ‚ΠΎ Π°Ρ€Ρ…ΠΈΠ² скачался ΠΊΡ€ΠΈΠ²ΠΎ, ΠΈ послС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Π²Ρ‹Π΄Π°Π» ΠΎΡˆΠΈΠ±ΠΊΡƒ.

ΠŸΡ€Π°Π²ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ архива… И – ΠΏΠΎΠ±Π΅Π΄Π°! πŸ™‚ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ.

https://www.youtube.com/watch?v=Nfns7uH03J8

ΠŸΠΎΡΠ»Π΅Π΄ΡΡ‚Π²ΠΈΡ ΠΈ рСакция Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ…Π°ΠΊΠ΅Ρ€Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ UC Browser, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ врСдоносныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π­Ρ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² контСкстС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, поэтому ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ всС Π΅Π³ΠΎ систСмныС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Как слСдствиС β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΠΈΡˆΠΈΠ½Π³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ доступ ΠΊ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΎΡ€Π°Π½ΠΆΠ΅Π²ΠΎΠΉ китайской Π±Π΅Π»ΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ хранящиСся Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π»ΠΎΠ³ΠΈΠ½Ρ‹, ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈ ΠΊΡƒΠΊΠΈ.

ΠœΡ‹ ΡΠ²ΡΠ·Ρ‹Π²Π°Π»ΠΈΡΡŒ с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ UC Browser ΠΈ сообщали ΠΈΠΌ ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈ Π΅Ρ‘ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, Π½ΠΎ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ с Π½Π°ΠΌΠΈ ΠΎΠ½ΠΈ Π½Π΅ стали. А Ρ‚Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π» Ρ‰Π΅Π³ΠΎΠ»ΡΡ‚ΡŒ с опасной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρƒ всСх Π½Π° Π²ΠΈΠ΄Ρƒ. Но ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ раскрыли Π΄Π΅Ρ‚Π°Π»ΠΈ уязвимости, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это, ΠΊΠ°ΠΊ Ρ€Π°Π½ΡŒΡˆΠ΅, ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ нСльзя. 27 ΠΌΠ°Ρ€Ρ‚Π° Π±Ρ‹Π»Π°
Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π° новая вСрсия UC Browser 12.10.9.1193, которая ΠΎΠ±Ρ€Π°Ρ‰Π°Π»Π°ΡΡŒ ΠΊ сСрвСру ΠΏΠΎ HTTPS: puds.ucweb.com/upgrade/index.xhtml.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, послС «исправлСния» ΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° написания ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ PDF ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ появлСнию сообщСния ΠΎΠ± ошибкС с тСкстом «Упс, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ!Β». Запрос ΠΊ сСрвСру ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ PDF Π½Π΅ выполнялся, Π½ΠΎ выполнялся запрос ΠΏΡ€ΠΈ запускС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌΠ΅ΠΊΠ°Π΅Ρ‚ Π½Π° ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ²ΡˆΡƒΡŽΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ исполняСмый ΠΊΠΎΠ΄ Π² Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ» Google Play.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com