• 泄露的core-android-audiocapture一款Android平台下基于DBI Hook框架的语音窃取工具,可窃取当前国内外流行的即时聊天工具,比如wechat、whatsapp、skype等等。
     
    【源码分析】
     
    1、搜索 mediaserver 进程,然后注入libt.so,并将窃取的语音文件dump到指定目录。
     
     
    2、查看libt.c源码,其动态链接库的构造函数为my_init,这里参数和返回值都必须为空。
     
     
    3、检测当前的Android系统是否为4.x版本,然后分不同的子版本进行处理。
     
     
    4、比如对于Android 4.0版本,会指定mStramType和mname的偏移量,不同系统版本对应的偏移量不同,同时也定义一些将被hook的函数,这些Hook_coverage_x是定义在hijack_func/hooker.h中,对应的函数名在注释代码中已经写得很清楚,主要是Hook Android系统的audio接口提供库libaudiofinger.so里的函数,以用于实现录音(RecordThread)和放音(PlaybackThread)功能。
     
     
     
     
    5、以Hook回调函数recordTrack_getNextBuffer3_h为例分析下它的修改行为,该函数定义在hijack_func/hooker_thumb.c中,原getNextBuffer获取的缓冲区主要是用于存放录音数据,而录音的开始、停止动作的相关函数也是被hook掉。在recordTrack_getNextBuffer3_h函数中先调用原始函数,得到返回后的结果,然后获取帧大小、采样率、帧数以及原始的AudioBufferProvider::Buffer地址。
     
     
    6、创建指定格式的文件名,将语音数据dump出来写入到前面创建的文件:
     
     
     
    7、录音Hook的日志记录如下,其它hook动作类似,此处就不一一分析。
     
     
    8、生成的dump文件,会再调用decode.py去转换成wav语音文件
     
     
     
    【结语】
     

     
         网上有人说这工具会去解密微信的语音格式,其实它根本没有做这方面的处理,也没必要,因为它Hook的Android系统的Audio库,当你使用一些即时聊天工具进行语音对话时,就会触发放音的函数,此时语音数据早就可以拿到,而decoder.py只是作一些wav的格式化处理,使得dump出来的文件能够转换成可播放的wav文件。在decoder目录下的一些聊天工具目录,只不过是Hacking Team成员在作一些测试而已。
  • 提取Android内核的方法

    日期:2015-06-16 | 分类:终端安全

    riusksk@MacBook:~/Downloads$ adb shell

     

    shell@hwmt7:/ $ su

    root@hwmt7:/ # ll /dev/block/platform/ff1fe000.dwmmc0/by-name |grep boot       

    lrwxrwxrwx root     root              2015-06-16 11:14 boot -> /dev/block/mmcblk0p13

     

    lrwxrwxrwx root     root              2015-06-16 11:14 fastboot -> /dev/block/mmcblk0p4

    root@hwmt7:/ # dd if=/dev/block/mmcblk0p13 of=/sdcard/boot.img

    24576+0 records in

    24576+0 records out

     

    12582912 bytes transferred in 0.630 secs (19972876 bytes/sec)

    riusksk@MacBook:~/Downloads$ adb pull /sdcard/boot.img

    3844 KB/s (12582912 bytes in 3.196s)

    riusksk@MacBook:~/Downloads$ xxd boot.img |head

    0000000: 414e 4452 4f49 4421 d87b 6900 0080 6000  ANDROID!.{i...`.

    0000010: dcf0 0e00 0000 3000 0000 0000 0000 5001  ......0.......P.

    0000020: 0000 2000 0008 0000 0000 0000 0000 0000  .. .............

    0000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................

    0000040: 766d 616c 6c6f 633d 3338 344d 206d 656d  vmalloc=384M mem

    0000050: 3d32 3034 346d 4030 7832 3030 3030 3020  =2044m@0x200000 

    0000060: 7073 6369 3d65 6e61 626c 6520 6d6d 6370  psci=enable mmcp

    0000070: 6172 7473 3d6d 6d63 626c 6b30 3a70 3128  arts=mmcblk0:p1(

    0000080: 7672 6c29 2c70 3228 7672 6c5f 6261 636b  vrl),p2(vrl_back

     

    0000090: 7570 292c 7037 286d 6f64 656d 6e76 6d5f  up),p7(modemnvm_

    riusksk@MacBook:~/Downloads$ sudo binwalk boot.img

     

    DECIMAL       HEXADECIMAL     DESCRIPTION

    --------------------------------------------------------------------------------

    24320         0x5F00          gzip compressed data, maximum compression, from Unix, NULL date: Thu Jan  1 08:00:00 1970

     

    6916096       0x698800        gzip compressed data, from Unix, last modified: Sun May 24 18:44:51 2015

    riusksk@MacBook:~/Downloads$ dd if=boot.img of=kernel.gz bs=1 skip=24320

    12558592+0 records in

    12558592+0 records out

    12558592 bytes transferred in 28.180051 secs (445655 bytes/sec)

    riusksk@MacBook:~/Downloads$ gzip -d kernel.gz 

     

    gzip: kernel.gz: decompression OK, trailing garbage ignored

    riusksk@MacBook:~/Downloads$ sudo binwalk kernel

     

    DECIMAL       HEXADECIMAL     DESCRIPTION

    --------------------------------------------------------------------------------

    9039952       0x89F050        Linux kernel version "3.10.30-00026-gba0947f-dirty (android@localhost) (gcc version 4ndroid@localhost) (gcc version 4.7 (GCC) ) #1 SMP PREEMPT Fri A"

     

    9057928       0x8A3688        gzip compressed data, maximum compression, from Unix, NULL date: Thu Jan  1 08:00:00 1970

    ……

    提取Android符号表:

    riusksk@MacBook:~/Downloads$ adb shell

    shell@hwmt7:/ $ su

    root@hwmt7:/ # echo 1 > /proc/sys/kernel/kptr_restrict

     

    root@hwmt7:/ # cat /proc/kallsyms > /sdcard/syms.txt 

    riusksk@MacBook:~/Downloads$ adb pull /sdcard/syms.txt

    3855 KB/s (2497834 bytes in 0.632s)

    riusksk@MacBook:~/Downloads$ head syms.txt

    c0608000 T stext

    c0608000 T _text

    c0608084 t __create_page_tables

    c0608144 t __turn_mmu_on_loc

    c0608150 T secondary_startup

    c06081bc T __secondary_switched

    c06081c8 t __secondary_data

    c06081d4 t __enable_mmu

    c0608200 t __fixup_pv_table

     

    c0608240 t __vet_atags

    将上述内容转成IDA idc脚本去重命名各函数:

     

    riusksk@MacBook:~/Downloads$ map2idc.py syms.txt

    riusksk@MacBook:~/Downloads$ head  syms.idc 

    #include <idc.idc>

    static main()

    {

    MakeNameEx(0xc0608000, "stext", 0);

    MakeNameEx(0xc0608000, "_text", 0);

    MakeNameEx(0xc0608084, "__create_page_tables", 0);

    MakeNameEx(0xc0608144, "__turn_mmu_on_loc", 0);

    MakeNameEx(0xc0608150, "secondary_startup", 0);

    MakeNameEx(0xc06081bc, "__secondary_switched", 0);

     

    MakeNameEx(0xc06081c8, "__secondary_data", 0);

    最后用IDA加载提取出来的kernel,设置加载基址0xc008000(Linux内核加载地址),然后运行上述idc脚本进行重命名:

  • 通过蓝牙调试Android Wear 应用

    日期:2015-05-25 | 分类:终端安全

    手机:允许USB调试,打开android wear应用设置允许“debugging over Bluetooth"

    手表:设置=》关于=》点击”Build number" 7次开启开发者选项,进入选择允许adb,允许蓝牙调试

    然后手机通过USB连接电脑,输入以下命令:

    riusksk@MacBook:~$ adb forward tcp:4444 localabstract:/adb-hub;

    * daemon not running. starting it now on port 5037 *

    * daemon started successfully *

    riusksk@MacBook:~$ adb connect localhost:4444

    connected to localhost:4444

    riusksk@MacBook:~$ adb devices

    List of devices attached 

    TA643009Y3 device

    localhost:4444 device

    riusksk@MacBook:~/Downloads$ adb -s localhost:4444 install KingRoot-4.0.0.233.apk 

    55 KB/s (6649985 bytes in 117.788s)

    pkg: /data/local/tmp/KingRoot-4.0.0.233.apk

    Success

    riusksk@MacBook:~/Downloads$ adb -s localhost:4444 uninstall com.example.test

     

    Success

    riusksk@MacBook:~$ adb -e shell

    shell@minnow:/ $ id

    uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:shell:s0

    shell@minnow:/system/bin $ ps

    USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME

    root      1     0     696    448   ffffffff 00000000 S /init

    root      2     0     0      0     ffffffff 00000000 S kthreadd

    root      3     2     0      0     ffffffff 00000000 S ksoftirqd/0

    root      5     2     0      0     ffffffff 00000000 S kworker/0:0H

    root      7     2     0      0     ffffffff 00000000 S watchdog/0

    root      8     2     0      0     ffffffff 00000000 S khelper

    root      321   2     0      0     ffffffff 00000000 S writeback

    root      323   2     0      0     ffffffff 00000000 S bioset

    root      325   2     0      0     ffffffff 00000000 S kblockd

    root      467   2     0      0     ffffffff 00000000 S khubd

    root      495   2     0      0     ffffffff 00000000 S cfg80211

    root      501   2     0      0     ffffffff 00000000 S spi1

    root      519   2     0      0     ffffffff 00000000 S irq/112-tps6591

    root      521   2     0      0     ffffffff 00000000 S spi2

    root      524   2     0      0     ffffffff 00000000 S spi3

    root      526   2     0      0     ffffffff 00000000 S spi4

    root      545   2     0      0     ffffffff 00000000 S khungtaskd

    root      546   2     0      0     ffffffff 00000000 S kswapd0

    root      592   2     0      0     ffffffff 00000000 S fsnotify_mark

    root      606   2     0      0     ffffffff 00000000 S crypto

    root      628   2     0      0     ffffffff 00000000 S minnow_panel_es

    root      638   2     0      0     ffffffff 00000000 S pvr_timer

    root      642   2     0      0     ffffffff 00000000 S pvr_sync_workqu

    root      750   2     0      0     ffffffff 00000000 S tusb

    root      761   2     0      0     ffffffff 00000000 S irq/211-atmxt-i

    root      775   2     0      0     ffffffff 00000000 S w1_bus_master1

    root      779   2     0      0     ffffffff 00000000 S irq/252-max170x

    root      794   2     0      0     ffffffff 00000000 S dm_bufio_cache

    root      796   2     0      0     ffffffff 00000000 S cfinteractive

    root      805   2     0      0     ffffffff 00000000 S mmcqd/0

    root      806   2     0      0     ffffffff 00000000 S mmcqd/0boot0

    root      807   2     0      0     ffffffff 00000000 S mmcqd/0boot1

    root      838   2     0      0     ffffffff 00000000 S binder

    root      886   2     0      0     ffffffff 00000000 S deferwq

    root      898   2     0      0     ffffffff 00000000 S f_mtp

    root      906   2     0      0     ffffffff 00000000 S file-storage

    root      914   1     664    392   ffffffff 00000000 S /sbin/ueventd

    root      1383  2     0      0     ffffffff 00000000 S ext4-dio-unwrit

    root      1387  2     0      0     ffffffff 00000000 S kworker/0:1H

    root      1390  2     0      0     ffffffff 00000000 S jbd2/mmcblk0p15

    root      1391  2     0      0     ffffffff 00000000 S ext4-dio-unwrit

    root      1395  2     0      0     ffffffff 00000000 S jbd2/mmcblk0p17

    root      1396  2     0      0     ffffffff 00000000 S ext4-dio-unwrit

    root      1400  2     0      0     ffffffff 00000000 S ext4-dio-unwrit

    root      1404  2     0      0     ffffffff 00000000 S jbd2/mmcblk0p16

    root      1405  2     0      0     ffffffff 00000000 S ext4-dio-unwrit

    logd      1407  1     6884   1812  ffffffff 00000000 S /system/bin/logd

    root      1408  1     1596   212   ffffffff 00000000 S /sbin/healthd

    root      1409  1     2360   1076  ffffffff 00000000 S /system/bin/lmkd

    system    1410  1     1240   536   ffffffff 00000000 S /system/bin/servicemanager

    root      1411  1     5756   1668  ffffffff 00000000 S /system/bin/vold

    system    1412  1     36324  18592 ffffffff 00000000 S /system/bin/surfaceflinger

    root      1413  1     2092   520   ffffffff 00000000 S /system/bin/adspd

    bluetooth 1415  1     1020   440   ffffffff 00000000 S /system/bin/uim-sysfs

    root      1416  1     10732  1212  ffffffff 00000000 S /system/bin/netd

    root      1417  1     1800   744   ffffffff 00000000 S /system/bin/debuggerd

    root      1418  2     0      0     ffffffff 00000000 S pvr_workqueue

    media     1419  1     23556  6176  ffffffff 00000000 S /system/bin/mediaserver

    install   1420  1     1156   560   ffffffff 00000000 S /system/bin/installd

    keystore  1422  1     4316   1732  ffffffff 00000000 S /system/bin/keystore

    root      1423  1     6092   1100  ffffffff 00000000 S /system/bin/ClockworkProxy

    media_rw  1424  1     3600   544   ffffffff 00000000 S /system/bin/sdcard

    root      1425  1     526048 41340 ffffffff 00000000 S zygote

    root      1429  2     0      0     ffffffff 00000000 S kauditd

    root      1452  2     0      0     ffffffff 00000000 S irq/171-m4senso

    root      1505  2     0      0     ffffffff 00000000 S omaplfb

    system    1733  1425  618456 75696 ffffffff 00000000 S system_server

    u0_a7     1801  1425  526884 28528 ffffffff 00000000 S android.process.media

    u0_a2     1860  1425  592488 71252 ffffffff 00000000 S com.google.android.wearable.app

    u0_a9     1877  1425  555896 46624 ffffffff 00000000 S com.motorola.targetnotif

    u0_a8     1896  1425  571540 35928 ffffffff 00000000 S com.google.android.gms.wearable

    u0_a8     1903  1425  566800 52796 ffffffff 00000000 S com.google.android.gms

    u0_a8     1926  1425  560524 35880 ffffffff 00000000 S com.google.process.gapps

    system    1992  1425  559624 54996 ffffffff 00000000 S com.google.android.apps.wearable.settings

    u0_a8     2006  1425  551032 25972 ffffffff 00000000 S com.google.process.location

    u0_a3     2062  1425  524404 24648 ffffffff 00000000 S com.google.android.clockwork.packageinstaller

    bluetooth 2124  1425  553856 28796 ffffffff 00000000 S com.android.bluetooth

    u0_a12    2164  1425  525784 24492 ffffffff 00000000 S com.google.android.deskclock

    u0_a1     2181  1425  522892 25584 ffffffff 00000000 S com.android.providers.calendar

    u0_a13    2233  1425  550880 56092 ffffffff 00000000 S com.google.android.apps.fitness

    u0_a15    2252  1425  527216 27956 ffffffff 00000000 S com.codoon.gps

    u0_a17    2278  1425  552052 51328 ffffffff 00000000 S com.watchkong.app

    u0_a5     2297  1425  524972 28196 ffffffff 00000000 S android.process.acore

    u0_a14    2326  1425  528112 25828 ffffffff 00000000 S com.tencent.mm

    shell     2339  1425  524140 22420 ffffffff 00000000 S com.google.android.apps.wearable.bugreportsender

    u0_a16    2352  1425  524884 22748 ffffffff 00000000 S com.google.android.apps.maps

    root      2582  2     0      0     ffffffff 00000000 S kworker/0:2

    shell     2625  1     7712   260   ffffffff 00000000 S /sbin/adbd

    root      2724  2     0      0     ffffffff 00000000 S kworker/u2:1

    root      2737  2     0      0     ffffffff 00000000 S kworker/u2:6

    root      2764  2     0      0     ffffffff 00000000 S kworker/0:0

    shell     2768  2625  1140   588   c0046cd8 b6f38b64 S /system/bin/sh

    root      2786  2     0      0     ffffffff 00000000 S kworker/u2:0

    root      2789  2     0      0     ffffffff 00000000 S kworker/u2:2

    root      2791  2     0      0     ffffffff 00000000 S kworker/u2:3

    root      2798  2     0      0     ffffffff 00000000 S kworker/u2:4

    root      2799  2     0      0     ffffffff 00000000 S kworker/u2:5

    root      2800  2     0      0     ffffffff 00000000 S kworker/u2:7

    root      2820  2     0      0     ffffffff 00000000 S kworker/0:1

    shell     2821  2768  2420   876   00000000 b6f59630 R ps

     

  • Frida——多平台Hook框架

    日期:2015-04-14 | 分类:终端安全

    官网:www.frida.re

    Frida是一款基于python + javascript 的hook与调试框架,通杀android\ios\linux\win\osx等各平台,相比xposed和substrace cydia更加便捷。

    入门实战文章《Instrumenting Android Applications with Frida》:http://blog.mdsec.co.uk/2015/04/instrumenting-android-applications-with.html ,里面以暴力破解Lollipin锁屏密码作为示例,使用相当方便,几行代码就可以搞定,还免编译。

    我另外写了个shell程序去启动Frida,以省去输一堆命令麻烦,有需要的朋友可以试用下。

    adb forward tcp:27042 tcp:27042

    adb forward tcp:27043 tcp:27043

     

    expect -c"

    spawn adb shell 

    expect \"shell@*\"

    send \"su\r\"

    expect \"root@*\"

    send \"data/local/tmp/frida-server -t 0\r\"

    interact

    "

  • Android 签名验证机制

    日期:2015-03-25 | 分类:终端安全

    签名后的APK,在/META-INF目录下会生成以下3个文件:

     

     

     

    MANIFEST.MF:保存除META-INF文件以外其它各文件的SHA-1+base64编码后的值。

     

     

    CERT.SF:在SHA1-Digest-Manifest中保存MANIFEST.MF文件的SHA-1+base64编码后的值,在后面的各项SHA1-Digest中保存MANIFEST.MF各子项内容SHA-1+Base64编码后的值 

     

     

    CERT.RSA/DSA/EC:保存用私钥计算出CERT.SF文件的数字签名、证书发布机构、有效期、公钥、所有者、签名算法等信息

     

     

     

    签名文件生成流程: 

     

    Android应用签名验证过程中,满足以下条件才能安装应用:

     

    1、SHA-1(除META-INF目录外的文件)  ==  MANIFEST.MF中的各SHA-1值;

    2、(SHA-1 + Base64)(MANIFEST.MF文件及各子项) ==  CERT.SF中各值

    3、公钥(CERT.SF) == CERT.RSA/DSA对SF文件的签名

     

    Android 中关于签名验证相关源码分析:

     关键源码主要位于:

    http://code.metager.de/source/xref/android/4.4/frameworks/base/core/java/android/content/pm/PackageParser.java

    http://code.metager.de/source/xref/android/4.4/libcore/luni/src/main/java/java/util/jar/JarVerifier.java

     

    1、读取DSA/RSA/EC后缀的签名证书文件,然后调用verifyCertificate进行难,此处并无限制文件名,因此将CERT.RSA改成CERT123.RSA依然有效,但SF文件得跟RSA文件等签名证书文件同名:

     

    2、读取SF(与后面证书同名)与RSA/DSA/EC文件的内容,再调用verifySignature进行校验: 

    3、在verifySignature进行校验时会去读取各项证书信息,包括证书序列号、拥有者、加密算法等等,然后判断CERT.RSA证书对CERT.SF的文件签名是否正确,防止CERT.SF被篡改,若成功则返回证书链,否则抛出异常:

    4、在返回证书链时,对于自签名证书,则直接作为合法证书返回 

    5、继续回到verifyCertificate函数,它会校验SF文件中的MANIFEST.MF中各项Hash值是否正确,防止MF文件被篡改:

    6、对于非系统应用,去枚举除META-INF目录以外的所有文件,然后进行哈希运算,并将其与MANIFEST.MF中的各文件哈希值进行比对,只有相匹配后才允许安装应用:

     

  • 获取 iPhone 基站信息

    日期:2015-03-19 | 分类:终端安全

  • 安装应用

    brew install libimobiledevice ifuse

    挂载程序目录

    ifuse --container app_bundleId ~/myapp

  • 在手机上打开要搜索的应用界面,然后输入以下命令列出Activity的相关信息:

     

     

    adb shell dumpsys activity | grep "Running activities" -A 7

     

    搜索 “Running activities” 可找到当前活动的activity栈情况,第一个就是当前界面所对应的Activity名称:

  • 智能设备WiFi抓包方式

    日期:2015-02-05 | 分类:终端安全

    由于现在很多智能设备都没有留调试接口,也无法通过USB连接去抓包网络通讯包,所以前天买了个 全民WiFi,直接插上电脑就会借助QQ或管家(冒似是要求登陆的)自动安装应用及驱动,相当方便,完全可以当一张外置的无线网卡来连wifi使用。

    不过在使用时,需要共享本地网络才能使得本机与连接wifi的设备才能正常连网。在用WireShark抓包时发现它根本无法识别出无线网卡,导致无法抓包,后来看网上推荐SmartWiFi,下载运行后发现确实可以正常识别网卡并抓包了。

  • Android Webview UXSS 漏洞攻防

    日期:2014-10-09 | 分类:终端安全

    Android Webview UXSS 漏洞攻防

     

    博文作者:riusksk

    发布日期:2014-10-09

    所在团队:腾讯安全应急响应中心

     

    “前事之不忘,后事之师”—— 《战国策·赵策》

     

    【开篇:前车之鉴】

     

           随着移动互联网的发展,很多PC端的安全问题也在移动端逐步出现。比如,使用WebKit内核的Chrome浏览器此前就出现过各种通用型的XSS(即UXSS,见文末附注)【如图1】,现在Android上也出现同类漏洞。Google把WebKit移植到了Android上,并将其作为WebView组件封装在SDK中,但官方忘记了“前车之鉴”,导致曾经在WebKit出现过的漏洞,在Android系统上再一次重现,即使该漏洞在PC版Chrome上已修复过。

     

    图1 :Chrome UXSS漏洞列表

           目前,许多Android应用是直接使用系统自带的WebView,进而导致系统上安装的各类应用可能受到WebView漏洞的影响,这就进一步将漏洞影响范围扩大化,使得各种主流应用都受其影响,一场未见销烟的血雨腥风就此展开。

     

    【中篇:血雨腥风】

     

           从2011年开始,Google的chromium项目的Bug列表就陆续被报告webkit存在一些UXSS漏洞。比如CVE-2011-3881 WebKitHTMLObjectElement UXSS漏洞,其对应的PoC代码【如图2】

     

    图2:CVE-2011-3881 PoC代码


    该漏洞主要由于HTMLPlugInImageElement::allowedToLoadFrameURL函数中对Javascript URL地址校验不足导致的跨域问题。查看下修复前后的代码对比【如图3】,可以发现修复代码对使用Javascript伪协议的URL增加了安全检测,只有当前域与内嵌ifame域的serucityOrigin安全信息(比如protocol、domain、host、port等等)在许可范围内才能互相访问,即浏览器的“同源策略“。

     


    图3:补丁代码对比

     

    补丁代码是调用securityOrigin::canAccess来检测是否同源,对应代码【如图4】该函数主要执行以下操作:

    1.      先判断两个securityOrigin信息是否相同,是否具备唯一性,相同时则返回真,不相同时又会根据是否设置document.domain进行不同的检测;

    2.      当两者均未设置document.domain时,则检测URL中的scheme、host、port是否相同,相同则返回真;

    3.      当均设置document.domain时,则检测URL的domain与scheme是否相同,相同则返回真;

    4.      若是打开本地文件,则执行其它文件安全检查。

     


    图4:SecurityOrigin::canAccess函数代码

     

    其它很多UXSS漏洞也是对源检测不全导致的跨域问题,虽然在Chrome浏览器上修复了,但由于Android系统引用了同一套WebKit,导致曾被修复的漏洞再次重现。

           2013年底,国内安全人员就开始陆续将这类Android UXSS爆光在网上,也有不少人到乌云平台上刷分。之后,各种主流IT资讯站点、漏洞平台、自媒体上纷纷可以见到Android上各种弹框框的场面,尤为火爆。

           此前,腾讯安全中心终端安全团队也对Android UXSS漏洞进行过研究,发现此类UXSS漏洞危害还是比较大的,且影响到许多主流的Android应用,特别是涉及金融交易、个人通讯等敏感功能的应用,很容易导致资金被窃、帐号被盗或者隐私泄露。对此,TSRC的同学做了个演示demo,通过提供一个二维码或者url发送给他人,当使用聊天工具或者购物应用扫描二维码或者打开链接后,那么就可以窃取到他人的个人资料【如图5】

     

    图5:利用UXSS漏洞窃取用户资料

          

           同时,TSRC的同学也开发出一款UXSS自动化检测工具【如图6】,既支持批量测试,也支持PC、Android浏览器的检测,也发现当前国内一些Android下的浏览器也受UXSS漏洞影响,个别PC端的浏览器也受到影响。

     



    图6:浏览器UXSS自动化检测工具

     

           Android UXSS主要是Android系统本身遗留的安全问题,但如果都各大应用厂商都依赖Google来修复的话,就显得过于被动了。而且即使Google修复了,多数用户也未必会及时升级。这样的话,许多用户依然可能会受到UXSS漏洞的影响。所以对于各应用厂商而言,动手去堆壁固垒筑造属于自己的城防是很有必要的。

     

    【下篇:堆壁固垒】

          

           在Android的WebViewClient对象中,提供有一个叫OnPageStarted的事件方法【如图7】,它是WebView注入代码最早的事件,因此我们可以在攻击者利用UXSS注入JS代码前执行我们自己的检测代码,判断是否存在跨域操作。

     

    图7:OnPageStared事件方法

     

           与此同时,还可通过对动态创建的危险元素进行 JS Hook,比如iframe、object等元素,然后再跟踪里面的的事件行为,看是否存在跨域,若存在就全部过滤掉,拒绝加载。

           目前腾讯安全中心终端安全团队已经完成该防御方案的开发,其测试效果【如图8】,可在不破坏程序稳定性的情况下,防御Android上的UXSS漏洞。

     

           

    图8:Android UXSS防御工具Demo

           
    前面提到的这些UXSS漏洞,目前已经在最新版Android 4.4中修复,同时它也提供了自动升级webkit的功能,以便及时修复漏洞,因此建议广大用户尽量采用最新版的Android系统。

           对于厂商,除采用OnPageStarted + JS Hook的方法,还可以打包最新的Webkit内核供自家产品调用,但这会大大增加应用包的体积,而且需要跟随Google Webkit官方进行更新,相对麻烦一些,各厂商可根据自身情况选定。

     

    【后记:路漫漫其修远】

     

           Android UXSS只是Android漏洞上的冰山一角,除此之外,还有addJavascriptInterface执行漏洞、FakeID漏洞等等,未来可能还会有其它漏洞被爆光,在面对这类安全问题时,如何更好地防御它,我们还有很多路要走。

           有攻,必有防,如何在攻与防的对立统一中寻求突破,是一个安全人员永恒的话题。

     

    【附注:何为UXSS】

     

           通用型跨站脚本(UXSS,Universal Cross-Site Scfipting),主要是利用浏览器及插件的漏洞(比如同源策略绕过,导致A站的脚本可以访问B站的各种私有属性,例如cookie等)来构造跨站条件,以执行恶意代码。它与普通的XSS的不同点就在于漏洞对象及受害范围的差异上,如表1所示。

     

    表1:UXSS与普通XSS的对比


    正是由于UXSS可影响在浏览器访问的所有站点,因此才将其称为通用型跨站。