应用安全 终端软件的主要风险 软件成熟度模型 具体举措 终端应用的主要风险 • 应用程序自身漏洞 • 重打包攻击/破解与逆向 • 基础环境漏洞 • 底层安全机制较弱 • 病毒木马(盗号) • 钓鱼攻击 终端应用的主要漏洞 攻击终端应用的常见手段 应用安全 终端软件的主要风险 软件成熟度模型 具体举措 软件安全成熟度模型 OWASP软件保障成熟度模型(Software Assurance Maturity Model, 简称SAMM) 内建安全成熟度模型(Building Security In Maturity Model,简称 BSIMM) 微软安全开发生命周期SDL(Security Development Lifecycle)优化模 型 CMMI+SAFE Gartner DevSecOps 微软SDL模型 Gartner SecDevOps 理想流图 应用安全 终端软件的主要风险 软件成熟度模型 具体举措 软件安全确保 软件加固 • 防反汇编 • 防调试 • 安全检查清单 软件安全确保(Software Security Assurance,SSA)& 内建安全(Build Security In,BSI)举措 Security architecture/design analysis • Logic analysis • Data analysis • Interface analysis • Constraint analysis • The principle of least privilege, • Defense in depth, • Audit trails tracking system activity, Secure code reviews, inspections, and walkthroughs Security testing 源码安全保障的一些举措 • 威胁模型分析(微软免费Threat Modeling Tool) • 源码合规检查。 • 源码缺陷分析。 • 源码成分(供应链)分析(黑鸭子/OWASP Dependency Check)。 • 开发流程对接。源码分析工具应当以最小代价透明地融入开发和 测试流程中。检测结果可与Bugzilla等Bug管理系统进行整合。 • 结果可视展现。 威胁建模步骤 应用安全测试AST工具分类 • 静态应用安全测试技术(Static Application Security Testing,简称 SAST)技术。可分为简单的代码编程规范检查;根据编译时信息 生成语法树进行代码执行全路径的扫描(每一个if/switch)是一个分 支。 • 动态应用安全测试技术(Dynamic Application Security Testing,简 称DAST)技术(可以尝试使用漏洞扫描和fuzz扫描工具)) • 交互式(IAST)、 • 软件成分分析(Software Component Analysis,简称SCA)技术等。 AST工具厂商 Synopsys • Synopsys分别针对白盒、黑盒和交互测试以及SCA相关产品: • SAST->Coverity • DAST->Defensics(模糊测试) • IAST->Seeker • 软件组成分析(SCA)产品——Protecode。2017.11月公布对专注自 动化开源软件保护与管理的黑鸭子软件(Black Duck Software)的收 购协议 一些免费开源的测试工具 SonarQube的自动化安全代码检测平台 Checkstyle(Java);P3C,阿里Java编程规范以及代码检查插件。 CppUnit&Cunit/Junit Facebook infer LinkedIn QARK Mobile Security Framework(MobSF) Uber NullAway Android Code Arbiter 安全设计&测试指导 安全设计&编程 • ISO/IEC 27034-1:2011 • ISO/IEC TR • 等保设计要求(GB/T 25070) • PCI Data Security Standarded (PCI DSS) • http://www.dwheeler.com/secure-programs/ • https://wiki.sei.cmu.edu/confluence/display/seccode/SEI+CER T+Coding+Standards 测试指导 • https://www.owasp.org/index.php/OWASP_Testing_Guide_v4 _Table_of_Contents 漏洞扫描器功能对比 • Rapid7 Nexpose/tenable Nessus的功能与OpenVAS功能是类似的, 主要用于漏洞挖掘(扫描); • BurpSuite与OWASP ZAP功能是类似的,它们都是一个代理,可以 修改浏览器发出的请求; • metasploit framework则主要用作载荷投递(即执行攻击)。 免费漏洞扫描工具 • 免费的有: OpenVAS、OWASP ZAP、w3af、Armitage、Google Firing Range、OWASP Webscarab(已经被OWASP ZAP所取代)、nikto、 Vega Proxy Scanner。 • 业界总体评价比较高的有: OpenVAS、 arachni 、OWASP ZAP、 w3af、Armitage。 • Fuzz 工具:SPIKE、大桃子 Peach、wfuzz等 应用安全 终端软件的主要风险 软件成熟度模型 具体举措 软件安全确保 软件加固 • 防反汇编 • 防调试 • 安全检查清单 终端应用基本防护策略 基本安全防护方案: 加壳、加密、逻辑混淆、代码隐藏,避免日 志输出、漏洞修复 协议/算法安全(是否正确的实现或者使用了协议和算法) 客户端安全检测。检测是否存在外挂、root以及调试攻击等情形 以及关联的账号(调试者身份识别)以及沙箱检测。 APP仿冒检测 防反汇编手段 Java层 • 代码混淆 • 使用加壳技术实现对Dex文件的加密。 • 核心算法写在naitive 库中(去掉符号表) C/C++层 • So库代码加密 • 正数SP堆栈指针值(即SP值加一个随机数,但是通过jmp指令跳过该指令以欺 骗反编译器) • 返回劫持技术(通过嵌入特殊汇编码扰乱程序调用栈) • 利用noreturn函数欺骗反汇编器 比起DEX文件,SO确实有不少优势: • 优势一:SO中为原生ARM汇编,难以还原原始代码。 • 优势二:SO调试成本高,而Java写的程序更容易被调试,如使用 SmaliIdea、Jeb、IDA、Xposed、插桩打日志等多种方式。 • 优势三:SO难以在x86生产环境中黑盒调用,而DEX文件可转换成 class文件,在生产环境中使用JNI直接传参调用。 正数SP(堆栈指针)值 利用noreturn函数进行欺骗 • 如标准库中的exit()或者abort()函数都属于noreturn函数。 • IDA在处理过程中会自动将某些函数标记为noreturn函数。 • 在生成指定函数的伪代码时,反编译器会忽略调用noreturn函数 后的任何代码。因为反编译器认为,调用类似exit()函数时,位于 这些函数后面的代码永远得不到执行机会。如果能够欺骗IDA, 使IDA认为某个函数为noreturn函数,那么恶意攻击者就能将代码 悄悄隐藏在该函数的调用语句后面。 • 借助一些二进制修改工具偷龙转凤替换原来被调用的函数,实现 对隐藏代码的调用。 noreturn欺骗 加壳程序 所谓加壳器,借助压缩以混淆数据等方式,防止诸如反汇编之类的逆向工程的一种工具。同 时,在进行压缩的过程中,加壳器还可以利用一些加密方法,来提供双层混淆。 壳(Stub)是可执行文件的一部分,其作用在于提取(解密、解压缩)Payload,以供执行。 主要步骤: 1.将Payload文件读入缓冲区; 2.使用指向缓冲区的指针及其原大小来更新结构; 3.压缩Payload缓冲区; 4.加密缓冲区; 5.创建壳(Stub)输出文件; 6.通过添加Payload缓冲区来更新壳。 壳程序(stub) 壳的作用在于提取并执行Payload。壳所执行的,是加壳器所执行 的反向操作。 下面是一个可行的设计方案: • 1.提取资源; • 2.解密Payload缓冲区; • 3.解压缩缓冲区; • 4.放置Payload; • 5.执行Payload。 webview程序的安全保护机制有: 代码压缩(compression),压缩的目的通常是减少传输量,但也取到降低可读性的作 用。 代码混淆(obfuscation), 常见的方法有: 分离静态资源, 打乱控制流、增加无意义的代码。 字符集转换 禁止远程调试,将WebView类中的静态方法setWebContentsDebuggingEnabled() 的返回值永久置为false。 防调试的主要手段 防JDWP调试 防JDWP调试 • 系统ro.debuggable属性, App的android:debuggable属性 • 通过守护程序对系统建立的socket连接进行轮询,检验socket连接 的属性是否符合调试特征,若发现有调试器连接则结束程序运行 或者断开连接。 防ptrace调试 • 防止单进程ptrace。使用一个守护进程对应用程序进行保护,守 护进程以某种时间间隔对应用进程的状态进行轮询,查看是否被 跟踪,若发现跟踪则退出程序。 • 防止双进程ptrace。可以使用进程环技术进行防御。进程环中使 用3个进程,每个进程分别监测其他两个进程的状态,若发现任 意进程处于被跟踪状态则立即结束进程。 防内存dump • 针对内存dump的攻击方法的防御思路主要是避免将dex文件一次 性载入内存,当需要运行到某个类,加载这个类时才会对该类进 行解密修复,用到某个方法时通过加固前保存的原始数据进行定 位,这样增加了一次性获取dex文件的难度。 Android系统常规安全检查项(一) 序号 1 2 3 4 5 6 7 8 9 检测点 说明 在Android项目中,如果有发送短信、接收短信、读取短信、获取位置、拨打 电话、读取联系人、读取设备信息等功能,必须要在AndroidManifest.xml中 敏感权限误用检测 配置这些权限,黑客只要找到这些权限就可以找到源码中相应功能的方法, 窃取用户的隐私。 该测试项用于检测Android客户端组件是否能够被测试者劫持而执行非法操作 软件组件劫持测试 。 内部存储敏感数据检测该测试项用于检测Android客户端是否在内部存储区明文存放敏感数据。 外部存储敏感数据检测该测试项用于检测Android客户端是否在外部存储区明文存放敏感数据。 内容提供者 黑客将apk破解后,根据代码逻辑,找到存储的文件,导致信息泄露。 检测apk中是否有密码输入、电话号码输入、http请求地址暴露的操作,黑客 敏感信息检测 将apk破解后,植入恶意代码,可以窃取用户的敏感信息 缓存信息敏感数据检测该测试项用于检测Android客户端是否在运行时的缓存信息中泄露敏感数据。 该测试项用于检测Android客户端能否检测到测试者对软件自动更新时下载的 升级包数据篡改测试 升级包文件进行了数据篡改。 该测试项用于检测Android客户端在加密通信中是否进行了证书锁定以抵抗中 加密证书锁定测试 间人攻击。 Android系统常规安全检查项(二) 10 11 12 13 14 15 16 17 18 该测试项用于检测Android客户端是否使用了自定义加密算法、有缺陷的密 码算法以及算法参数存在安全问题 检测源码中声明的字符串储存提示文字、协议地址等常量,黑客破解apk可 字符串初始化检测 以通过源码搜索获取到声明的字符串定位源码块造成源码安全风险。 该测试项用于检测源码中通过资源索引调用相应的资源文件实现方式,黑 资源索引引用检测 客破解apk可以通过对源码中资源索引搜索定位源码块造成源码安全风险。 该测试项用于检测Android客户端是否存在对静态反编译分析的防御能力不 抗反编译测试 足的安全问题。 该测试项用于检测Android客户端在调用其他进程过程中是否会被测试者拦 进程调用拦截测试 截进行引诱攻击 SharedPreferences 黑客将apk破解后可以读取和修改value值 数据库敏感数据检测该测试项用于检测Android客户端是否在数据库中明文存放敏感数据。 调试信息敏感数据检 检测apk源码是否有打印日志的操作,黑客将apk破解后,修改源码,可以 测 打印调试信息,使敏感信息泄露。 密码键盘输入安全性 该测试项用于检测Android客户端在身份验证过程中使用键盘输入密码是否 测试 存在安全问题。 通信加密配置检测