从XCodeGhost事件看软件来源鉴别的重要性
事件
事件引爆于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事件看软件来源鉴别的重要性的更多相关文章
- 在XcodeGhost事件之后,获取更纯净的Xcode的方法。
正值Xcode 7正式版本的更新,IOS界就冒出了个甚至可以说成涉及国家安全的大事也不为过的事件: 也可以点击网址链接看总结的更完整的文章:众多知名 APP 都中毒了,XCodeGhost 病毒事件汇 ...
- 从Facebook数据泄露事件看大数据时代的个人信息安全问题
进入21世纪后,互联网开始大规模普及,线上业务和线上服务也开始逐渐走入人们的生活.尤其在智能手机和移动互联网诞生以后,人们对网络的依赖更是与日俱增.然而,伴随而来的则是涉及个人隐私的信息安全问题.个人 ...
- 从HTTL模板引擎看软件设计原则
HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似.作者是阿里巴 ...
- 从华为数字化转型看IT自动化运维重要性
关注嘉为科技,获取运维新知 8月有幸聆听了华为CIO陶总(陶景文)关于“华为数字化转型秘诀:坚定“以客户为中心”的思想”的演讲,获益良多.其中陶总也分享了IT运营平台的建设对于华为实现数字化转型的重要 ...
- OpenStack学习系列-----第二篇 由一个错误看理解整个架构的重要性
看了openstack没几天,然后就开始试着用Java调用所有的API,第一步得到Credentials的时候成功了,然后第二步,传参数使所有的server信息都列出来的时候报错404.具体描述如下( ...
- 从性能角度看react组件拆分的重要性
React是一个UI层面的库,它采用虚拟DOM技术减少Javascript与真正DOM的交互,提升了前端性能:采用单向数据流机制,父组件通过props将数据传递给子组件,这样让数据流向一目了然.一旦组 ...
- Windows 事件查看器(收集)
原文:Windows 事件查看器(收集) 事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理 ...
- CSO视角:Sigstore如何保障软件供应链安全?
本文作者 Chris Hughes,Aquia的联合创始人及CISO,拥有近20年的网络安全经验. SolarWinds 和 Log4j 等影响广泛的软件供应链攻击事件引起了业界对软件供应链安全的关注 ...
- jQuery学习-事件之绑定事件(五)
大家应该还记得dispatch方法中有这么一段代码: event = jQuery.event.fix( event ); event的修复是在fix这个方法中的,而在fix中是通过 new jQue ...
随机推荐
- @html.dropdown用法
controller1 List<SelectListItem> itemList = new List<SelectListItem>() { "}, " ...
- WPF中在摄像头视频上叠加控件的解决方案
一.视频呈现 前段时间,在一个wpf的项目中需要实时显示ip摄像头,对此的解决方案想必大家都应该知道很多.在winform中,我们可以将一个控件(一般用panel或者pictruebox)的句柄丢给摄 ...
- 使用VS Code开发C++
1. 参考/转载 vs code进行c/c++开发 VSCode 的第一个C++程序(windows)[更新2018.10.28] 2. C++开发相关插件(扩展商店中直接搜索) 至少要装C/C++. ...
- .db轻量级本地数据库
1.概述: db文件一般是数据库数据存放文件. db是datebase的缩写,是数据库文件. 我们可以简单的理解为db是本地轻量级数据库(用了缓存,储存少量本地数据,防止断电等突发意外的发生对我们的程 ...
- select chosen 的入门使用
首先要引用 因为肯定要引用jq,所以就没有写啦 <link rel="stylesheet" href="__ROOT__/Public/jschy/chosen_ ...
- docker概述及基础操作
docker概述 容器技术已经成为应用程序封装和交付的核心技术容器技术的核心有以下几个内核组成CGroups-资源管理NamsSpace-进程管理SElinux-安全 由于是在物理机上实施隔离,启动一 ...
- Python和qqbot库开发简单的机器人
from qqbot import QQBotSlot as qqbotslot, RunBot @qqbotslot def onQQMessage(bot, contact, member, co ...
- C++_类入门4-String类
很多应用程序都需要处理字符串.C语言在string.h(C++中为cstring)中提供了一系列的字符串函数,很多早期的C++实现为处理字符串提供了自己的类. string类是由头文件string支持 ...
- 洛谷 P3267 [JLOI2016/SHOI2016]侦察守卫(树形dp)
题面 luogu 题解 树形\(dp\) \(f[x][y]表示x的y层以下的所有点都已经覆盖完,还需要覆盖上面的y层的最小代价.\) \(g[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上 ...
- Tensorlflow-解决非线性回归问题
import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt #使用numpy生成200个随机点,范围从-0.5到0 ...