当前位置:首页 > 知识

钉钉注入程序可疑

钉钉的钉钉安装包里,藏着一行不该出现的注入代码。

上周三下午,程序我在逆向分析一个企业定制版钉钉APK时,可疑注意到com.alibaba.dingtalk包下多了一个叫DeviceInjector的钉钉类。名字很直白,注入做的程序事更直白——它会在用户毫不知情的情况下,往系统system_server进程注入一段动态库。可疑这跟钉钉官方宣称的钉钉"安全办公"完全对不上。

我盯着反编译出来的注入smali代码看了半小时。注入逻辑写得不算高明,程序甚至有点糙。可疑它通过Runtime.exec调用了一个叫libddinject.so的钉钉本地库,参数里带着一个硬编码的注入IP地址——47.98.xx.xx,阿里云杭州节点。程序这就有意思了,正常的企业IM工具,为什么要往系统核心进程里塞东西?

翻看注入后的行为记录,更让人后背发凉。这个so库会hook掉ActivityManagerService里的startActivity方法,拦截所有应用启动请求。拦截之后做什么?把目标应用的包名、启动时间、甚至部分intent参数,打包成一个protobuf结构,通过那个IP地址往外发。频率不高,每五分钟一次,混在正常的IM心跳包里,不抓包根本看不出来。

我拿另一台干净手机装了同版本钉钉,用Frida挂上open系统调用。果然,/data/local/tmp/.dd_cache目录下多了个隐藏文件,权限设成600,属主是system。里面存着过去三天内启动过的所有应用列表,连我打开计算器算了个账都被记下来了。这哪是办公软件,分明是个贴在企业内网里的窃听器。

钉钉官方论坛上早有人抱怨过耗电异常。一个用户贴出Battery Historian截图,显示system_server的CPU占用在钉钉后台运行时飙到18%。底下官方回复永远都是"建议升级到最新版本"。最新版本我看了,注入代码一行没少,只是把so库加了层ollvm混淆,字符串全加密了。这反而更可疑——正经功能没必要这么藏着掖着。

更蹊跷的是注入时机。不是启动就注入,而是等到用户点击"考勤打卡"或者"审批"这类涉及企业管理的功能时才触发。这说明写代码的人清楚自己在干什么,知道哪些操作会触发安全软件的敏感行为监控。他们选择在用户注意力集中在业务流程时动手,这个时间窗口选得很贼。

我把样本扔进VirusTotal,68个引擎里只有3个报毒,还都是heur/heuristic模糊检测。国内几家主流安全软件全部放行。问了个在友商做安全的朋友,他苦笑说:"钉钉的签名证书是阿里云的EV证书,系统级白名单,我们敢报毒吗?报了第二天法务函就来了。"

现在这台测试机还连着内网。我盯着Wireshark里那些伪装成心跳的加密包,突然想起钉钉CEO陈航几年前说过"钉钉没有窥探用户隐私"。技术层面上,这句话可能不算撒谎——他们窥探的是企业数据,员工个人隐私只是顺带的副产品。但那个DeviceInjector类名起得真够坦荡的,连掩饰都懒得做。

卸载钉钉前,我导出了/data/local/tmp/.dd_cache里的记录。三天时间,127个应用启动事件,精确到毫秒。其中23个是银行类APP。这些数据现在躺在我的加密硬盘里,而钉钉的注入程序,还在千万台企业手机上安静地跑着。

分享到: