事件

事件引爆于9月18日乌云网公布的一则分析报告:“XCode编译器里有鬼 – XCodeGhost样本分析”,这份纯粹的技术分析报告引发中国iOS生态链的众多开发者的关注。 引起关注的人们对App Store上进行了筛查,结果令人震惊,至少有数十款流行的应用受到感染,其中包括了微信、网易云音乐、网易公开课、我叫MT、同花顺、南京银行、南方航空、中信银行行动卡空间、名片全能王、愤怒的小鸟2等等知名应用,被感染的用户估计超过1亿。

具体的说,这些APP使用了非苹果官方的,来自网盘等第三方下载平台,存在安全问题的Xcode开发环境。用这个XCode把应用源程序编译成可执行的APP时,APP会被自动添加病毒模块。用户从App Store下载安装这样的APP,手机就会中毒,病毒会偷偷地向作者的服务器上传软件包名、应用名、系统版本、语言、国家等信息。幸运的是,此次事件未给公众造成重大损失,还没用危及隐私或者帐号密码等敏感信息。然而,从技术层面看,这完全是病毒作者的“手下留情”,只要插入的病毒代码更恶毒一些,他就会获得超过1亿个“肉鸡”。

这一事件提示我们,使用数字签名或者散列(也称哈希Hash、摘要Digest)等加密机制,鉴别网上软件的来源是多么的重要。

散列值

散列函数(或散列算法,Hash Function)是从任何长度数据创建小的数字“指纹”的方法。散列将数据打乱混合计算,得到一个称为散列值的结果。散列值看起来通常是一个短的随机字母和数字组成的字符串。用作校验目的的散列函数是一个“单向”操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。被广泛使用的这类散列函数包括MD5,SHA-1,SHA-256等。许多软件在官网下载页面上提供了散列值。软件下载完成后,使用散列工具计算下载到的文件的散列值,与官网上的散列值(如图1所示)比对后即可确认所下载的软件与官网发布的是否完全一致。

图1  Ubuntu官网给出的安装光盘映像散列值

检验散列的工具和方法

虽然Windows系统内部广泛使用MD5、SHA1等常用散列算法,但是系统并没有提供一个计算MD5的程序或者命令。网络上有大量的计算散列的软件可供下载,可以在搜索引擎上搜索并参考口碑选择一个。使用openssl命令计算SHA1散列值的截图如下。

图 2 使用openssl命令计算散列值

Linux内置有md5sum, sha1sum这两个命令。在终端中运行md5sum <filename>,或者sha1sum <filename> 即可得到相应的散列值。

数字签名

数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。

数字签名(Digital Signature)技术是不对称加密算法的典型应用。数字签名的应用过程是,数据源发送方使用自己的私钥对数据校验和或其他与数据内容有关的变量进行加密处理,完成对数据的合法“签名”,数据接收方则利用对方的公钥来解读收到的“数字签名”,并将解读结果用于对数据完整性的检验,以确认签名的合法性。

数字签名的验证

Windows环境下,经过了数字签名的软件很容易验证其来源和洁净性。在文件属性对话框的“数字签名”页中,点击“详细信息”,即可检验软件的数字签名。下图是对从网盘上下载的android-studio-bundle-135.1740770-windows.exe的数字签名验证的结果。

图2 有效的软件数字签名

如果软件被篡改,或者证书被篡改,都会导致签名的验证呈现无效的状态。下图是使用Hex编辑器人为修改Adobe Reader安装包之后,检测数字签名无效的截图。

图3 无效的数字签名演示

小结

墙的存在,外部官网的可达性和速度是一个难以绕过得现实问题。墙内通过第三方下载平台获取Android Studio、XCode等开发工具,仍然将是很多人的首选。XCodeGhost事件提醒我们,从第三方渠道下载任何软件安装包之后,一定不要忽略检验数字签名,或者比对官网版本的散列值;无法通过验证的,必须果断拒之门外。其次,这一事件也与盗版的“黑苹果”有一定关系,“免费下载”的盗版软件决不是免费的!

从XCodeGhost事件看软件来源鉴别的重要性的更多相关文章

  1. 在XcodeGhost事件之后,获取更纯净的Xcode的方法。

    正值Xcode 7正式版本的更新,IOS界就冒出了个甚至可以说成涉及国家安全的大事也不为过的事件: 也可以点击网址链接看总结的更完整的文章:众多知名 APP 都中毒了,XCodeGhost 病毒事件汇 ...

  2. 从Facebook数据泄露事件看大数据时代的个人信息安全问题

    进入21世纪后,互联网开始大规模普及,线上业务和线上服务也开始逐渐走入人们的生活.尤其在智能手机和移动互联网诞生以后,人们对网络的依赖更是与日俱增.然而,伴随而来的则是涉及个人隐私的信息安全问题.个人 ...

  3. 从HTTL模板引擎看软件设计原则

    HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似.作者是阿里巴 ...

  4. 从华为数字化转型看IT自动化运维重要性

    关注嘉为科技,获取运维新知 8月有幸聆听了华为CIO陶总(陶景文)关于“华为数字化转型秘诀:坚定“以客户为中心”的思想”的演讲,获益良多.其中陶总也分享了IT运营平台的建设对于华为实现数字化转型的重要 ...

  5. OpenStack学习系列-----第二篇 由一个错误看理解整个架构的重要性

    看了openstack没几天,然后就开始试着用Java调用所有的API,第一步得到Credentials的时候成功了,然后第二步,传参数使所有的server信息都列出来的时候报错404.具体描述如下( ...

  6. 从性能角度看react组件拆分的重要性

    React是一个UI层面的库,它采用虚拟DOM技术减少Javascript与真正DOM的交互,提升了前端性能:采用单向数据流机制,父组件通过props将数据传递给子组件,这样让数据流向一目了然.一旦组 ...

  7. Windows 事件查看器(收集)

    原文:Windows 事件查看器(收集) 事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理 ...

  8. CSO视角:Sigstore如何保障软件供应链安全?

    本文作者 Chris Hughes,Aquia的联合创始人及CISO,拥有近20年的网络安全经验. SolarWinds 和 Log4j 等影响广泛的软件供应链攻击事件引起了业界对软件供应链安全的关注 ...

  9. jQuery学习-事件之绑定事件(五)

    大家应该还记得dispatch方法中有这么一段代码: event = jQuery.event.fix( event ); event的修复是在fix这个方法中的,而在fix中是通过 new jQue ...

随机推荐

  1. .net core in Docker 部署方案(随笔)

    前一段时间由于项目需要 .net core 在docker下的部署,途中也遇到很多坑,看了各同行的博客觉得多多少少还是有些问题,原本不想写此篇文章,由于好友最近公司也需要部署,硬是要求,于是花了些时间 ...

  2. libcurl坑

    code = curl_easy_setopt(conn, CURLOPT_URL, ca.strUrl.c_str()); 要char* 不能string

  3. 初学python - 常见函数使用

    *** 读入两个整数 a,b=eval(input()) ***range()函数 创建列表 :range( 1, 11,2) - 产生 [1,11) 相差为2数,2为步长 ***print()函数 ...

  4. 20165219第4次实验《Android程序设计》实验报告

    20165219第4次实验<Android程序设计>实验报告 一.实验内容及步骤 (一)Android Stuidio的安装Hello world测试 要求 参考http://www.cn ...

  5. python3好用的requests库

    python3好用的requests库 requests是什么? requests是基于urllib编写的http库,支持python3,比urllib更好用,更简单.之前使用python写一些htt ...

  6. spark执行例子eclipse maven打包jar

    首先在eclipse Java EE中新建一个Maven project具体选项如下 点击Finish创建成功,接下来把默认的jdk1.5改成jdk1.8 然后编辑pom.xml加入spark-cor ...

  7. 深度学习TensorFlow常用函数

    tensorflow常用函数 TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CPU 还是 GPU, Tensor ...

  8. (Keil) Debug & Simulation 操作

    0x00 printf在MCU環境下print debug error message,利用Logic Analyzer模擬MCU register or GPIO狀態. 若是要要使用printf函數 ...

  9. Django 内建 中间件组件

    中间件 这篇文档介绍了Django自带的所有中间件组件. 要查看关于如何使用它们以及如何编写自己的中间件,请见中间件使用指导. 可用的中间件 缓存中间件 class UpdateCacheMiddle ...

  10. LeetCode74.搜索二维矩阵

    74.搜索二维矩阵 描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 示 ...