精华内容
下载资源
问答
  • 软件开发安全高清PPT

    2018-07-13 10:39:18
    软件开发安全实践PPT资料,非常详细,也是写软件安全开发相关材料的必备PPT
  • 本标准主要针对PC或(和)服务器架构的应用软件,从安全意识和设计的角度,提出通用的、不局限于特定编程语言的安全编程规范,主要针对软件开发人员的编程过程进行约束,包括软件开发人员在编程初期的环境搭建、系统...
  • Gartner99%的组织在其IT系统中使用了开源软件 Gartner现代软件大多数是被组装出来的不是被开发出来的 Forrester软件开发中80-90%的代码来自于开源软件;开源软件安全形势严峻;开源软件安全形势严峻;1开源软件安全现状...
  • xxx 软件开发安全管理规定 xxx 软件开发安全管理规定 第一章 总则 第一章 总则 第一条 为加强 xxx 软件开发安全管理保护软件开发中软件 第一条 为加强 xxx 软件开发安全管理保护软件开发中软件 和信息安全依据...
  • 软件行业飞速发展的同时也产生了开发过程当中诸多影响企业发展的安全问题,源代码安全就是企业信息安全之一,也是企业安全问题的重点之一。 软件开发企业所面临的源代码安全问题: 1.开发过程中,源代码通过...

    一、开发企业所面临的源代码安全问题

    互联网的兴起让软件开发企业有了飞速的发展,全国各行业都产生了软件信息化的支持,给企业管理与发展进程提升了效率与速度!软件行业飞速发展的同时也产生了开发过程当中诸多影响企业发展的安全问题,源代码安全就是企业信息安全之一,也是企业安全问题的重点之一。

    软件开发企业所面临的源代码安全问题:

    1.开发过程中,源代码通过复制,上传,外发,截屏,录屏等手段进行泄密;

    2.开发过程中,多人共同开发的源代码会涉及到个人违规储存等问题;

    3.开发企业本身并没有一套涉密数据安全的存储环境,在逻辑上不能培养员工的产权保护意识;

    4.开发企业对于开发成果没有统一严谨的安全管理制度;

    二、开发企业源代码保护的相关方法

    开发企业现行的源代码保护方法主要是开发设备本身提高代码保密级别,利用源代码保护软件对源代码开发过程进行加密,提高开发人员保密意识利用开发代码认证或权利认证对软件代码进行保护。

    1.利用加密硬件对项目进行开发;

    2.在软件开发过程中,对开发平台提高系统安全级别;

    3.利用加密软件对开发过程中的泄密途径进行加密,如通过LOG文件对代码进行复制、通过通信程序对代码进行保存、在IE编绎过程中用IE另存为;

    4.利用硬盘加密技术和纵深级驱动加密技术对软件开发过程进行加密;

    5.利用内网加密产品保护开发环境的安全性;

    三、源代码保护在软件开发企业中的重要性

    1.为企业代码安全提供平台;

    2.保障企业产品相关知识产权;

    3.避免企业间的恶性竞争;

    4.保护企业产品权益,保持产品优势;

    5.为企业的良性创新提供环境平台;

    展开全文
  • Android软件安全开发实践

    千次阅读 2014-09-26 10:16:53
    Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题。本系列将分两期,探讨Android开发中常见的安全隐患和解决方案。第一期将从数据存储、网络通信、密码和认证策略这三个角度,带你走上Android...

    Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题。本系列将分两期,探讨Android开发中常见的安全隐患和解决方案。第一期将从数据存储、网络通信、密码和认证策略这三个角度,带你走上Android软件安全开发实践之旅。

    过去两年,研究人员已发现Android上的流行软件普遍存在安全缺陷或安全漏洞。漏洞频发的原因可能有很多,例如以下几种。

    • 与一切都是集中管理的iOS相比,Android提供了一种开放的环境,在获得了灵活性、可以满足各种定制需求的同时,也损失了部分安全性。

    • 开发团队通常将精力集中在产品设计、功能实现、用户体验和系统效率等方面,而很少考虑安全问题。

    • Android提供的安全机制比较复杂,开发者需要理解它们,并对常见的攻击思路和攻击方法有所了解,才能有效地保护软件。

    • 一方面,目前很少出现对特定移动软件安全漏洞的大规模针对性攻击,在真实的攻击出现之前,许多人对此并不重视。另一方面,利用这些漏洞展开攻击并不太难,许 多攻击方法和工具都已经成熟。一旦出现这种攻击,用户的个人隐私数据可能发生泄漏,账户信息可能被盗取,如果与钓鱼等攻击结合,甚至可能产生经济损失。产 品开发团队则可能由此面临信任危机和法律风险。

    我在此前进行的一些安全评估中,看到不少开发团队已具有非常高的安全开发水平,但也发现有知 名企业的软件存在各种缺陷。在本文中,我们将向大家介绍Android软件中比较常见的安全缺陷或安全漏洞,分析产生问题的原因,介绍可能的攻击方法,并 给出解决问题的建议。希望能抛砖引玉,引起大家对这类问题的关注。

    数据存储

    Android软件可以使用的存储区域分为外部(SD卡)和内部(NAND闪存)两种。除了大小和位置不同之外,两者在安全权限上也有很大的区别。外部存储的文件没有读写权限的管理,所有应用软件都可以随意创建、读取、修改、删除位于外部存储中的任何文件,而仅仅需要申明READ_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限。内部存储则为每个软件分配了私有区域,并有基于Linux的文件权限控制,其中每个文件的所有者ID均为Android为该软件设立的一个用户ID。通常情况下,其他软件无权读写这些文件。

    关于数据存储可能出现的问题包括以下几种。

    将隐私数据明文保存在外部存储

    例如,聊天软件或社交软件将聊天记录、好友信息、社交信息等存储在SD卡上;备份软件将通信录、短信等备份到SD卡上等。如果这些数据是直接明文保存(包括 文本格式、XML格式、SQLite数据库格式等)的,那么攻击者写的软件可以将其读取出来,并回传至指定的服务器,造成隐私信息泄露。

    较好的做法是对这些数据进行加密,密码保存在内部存储,由系统托管或者由用户使用时输入。

    将系统数据明文保存在外部存储

    例如,备份软件和系统辅助软件可能将用户已安装的其他软件数据保存至SD卡,以便刷机或升级后进行恢复等;或者将一些系统数据缓存在SD卡上供后续使用。同样的,如果这些数据是明文保存的,恶意软件可以读取它们,有可能用于展开进一步的攻击。

    将软件运行时依赖的数据保存在外部存储

    如果软件将配置文件存储在SD卡上,然后在运行期间读取这些配置文件,并根据其中的数据决定如何工作,也可能产生问题。攻击者编写的软件可以修改这些配置文 件,从而控制这些软件的运行。例如,如果将登录使用的服务器列表存储在SD卡中,修改后,登录连接就会被发往攻击者指定的服务器,可能导致账户泄露或会话 劫持(中间人攻击)。

    对这种配置文件,较安全的方法是保存到内部存储;如果必须存储到SD卡,则应该在每次使用前判断它是否被篡改,例如,与预先保存在内部的文件哈希值进行比较。

    将软件安装包或者二进制代码保存在外部存储

    现在很多软件都推荐用户下载并安装其他软件;用户点击后,会联网下载另一个软件的APK文件,保存到SD卡然后安装。

    也有一些软件为了实现功能扩展,选择动态加载并执行二进制代码。例如,下载包含了扩展功能的DEX文件或JAR文件,保存至SD卡,然后在软件运行时,使用 dalvik.system.DexClassLoader类或者java.lang.ClassLoader类加载这些文件,再通过Java反射,执行 其中的代码。

    如果在安装或加载前,软件没有对SD卡上的文件进行完整性验证,判断其是否可能被篡改或伪造,就可能出现安全问题。

    在这里,攻击者可以使用称 为“重打包”(re-packaging)的方法。目前大量Android恶意代码已采用这一技术。重打包的基本原理是,将APK文件反汇编,得到 Dalvik指令的smali语法表示;然后在其中添加、修改、删除等一些指令序列,并适当改动Manifest文件;最后,将这些指令重新汇编并打包成 新的APK文件,再次签名,就可以给其他手机安装了。通过重打包,攻击者可以加入恶意代码、改变软件的数据或指令,而软件原有功能和界面基本不会受到影 响,用户难以察觉。

    如果攻击者对软件要安装的APK文件或要加载的DEX、JAR文件重打包,植入恶意代码,或修改其原始代码;然后在SD 卡上,用其替换原来的文件,或者拷贝到要执行或加载的路径,当软件没有验证这些文件的有效性时,就会运行攻击者的代码。攻击结果有很多可能,例如直接发送 扣费短信,或者将用户输入的账户密码发送给指定的服务器,或者弹出钓鱼界面等。

    因此,软件应该在安装或加载位于SD卡的任何文件之前,对其完整性做验证,判断其与实现保存在内部存储中的(或从服务器下载来的)哈希值是否一致。

    全局可读写的内部文件

    如果开发者使用openFileOutput(String name,int mode)方法创建内部文件时,将第二个参数设置为Context.MODE_WORLD_READABLE或 Context.MODE_WORLD_WRITEABLE,就会让这个文件变为全局可读或全局可写的。

    开发者也许是为了实现不同软件之间的数据共享,但这种方法的问题在于无法控制哪个软件可以读写,所以攻击者编写的恶意软件也拥有这一权限。

    如果要跨应用共享数据,一种较好的方法是实现一个Content Provider组件,提供数据的读写接口,并为读写操作分别设置一个自定义权限。

    内部敏感文件被root权限软件读写

    如果攻击者的软件已获得root权限,自然可以随意读写其他软件的内部文件。这种情况并不少见。

    • 大量的第三方定制ROM提供了root权限管理工具,如果攻击者构造的软件伪造成一些功能强大的工具,可以欺骗用户授予它root权限。

    • 即便手机安装的官方系统,国内用户也大多乐于解锁、刷recovery并刷入root管理工具。

    • 在Android 2.2和2.3中,存在一些可以用于获取root权限的漏洞,并且对这种漏洞的利用不需要用户的确认。

    因此,我们并不能假设其他软件无法获取root权限。即便是存在内部的数据,依然有被读取或修改的可能。

    前面提到,重要、敏感、隐私的数据应使用内部存储,现在又遇到root后这些数据依然可能被读取的问题。我对这个问题的观点是,如果攻击者铤而走险获得root权限(被用户觉察或者被安全软件发现的风险),那理论上他已拥有了系统的完整控制权,可以直接获得联系人信息、短信记录等。此时,攻击者感兴趣的 软件漏洞利用更可能是获得其他由软件管理的重要数据,例如账户密码、会话凭证、账户数据等。例如,早期Google钱包将用户的信用卡数据明文存储,攻击 者获取这些数据后,可以伪装成持卡人进行进一步攻击以获得账号使用权。这种数据就是“其他由软件管理的重要数据”。

    这个问题并没有通用的解决方法。开发者可能需要根据实际情况寻找方案,并在可用性与安全性之间做出恰当的选择。

    网络通信

    Android软件通常使用WiFi网络与服务器进行通信。WiFi并非总是可信的。例如,开放式网络或弱加密网络中,接入者可以监听网络流量;攻击者可以自己设置WiFi网络钓鱼。此外,在获得root权限后,还可以在Android系统中监听网络数据。

    不加密地明文传输敏感数据

    最危险的是直接使用HTTP协议登录账户或交换数据。例如,攻击者在自己设置的钓鱼网络中配置DNS服务器,将软件要连接的服务器域名解析至攻击者的另一台服务器;这台服务器就可以获得用户登录信息,或者充当客户端与原服务器的中间人,转发双方数据。

    早期,国外一些著名社交网站的Android客户端的登录会话没有加密。后来出现了黑客工具FaceNiff,专门嗅探这些会话并进行劫持(它甚至支持在WEP、WPA、WPA2加密的WiFi网络上展开攻击!)。这是目前我所知的唯一一个公开攻击移动软件漏洞的案例。

    这类问题的解决方法很显然—对敏感数据采用基于SSL/TLS的HTTPS进行传输。

    SSL通信不检查证书有效性

    在SSL/TLS通信中,客户端通过数字证书判断服务器是否可信,并采用证书中的公钥与服务器进行加密通信。

    然而,有开发者在代码中不检查服务器证书的有效性,或选择接受所有的证书。例如,开发者可以自己实现一个X509TrustManager接口,将其中的 checkServerTrusted()方法实现为空,即不检查服务器是否可信;或者在SSLSocketFactory的实例中,通过 setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER),接受所有证 书。做出这两种选择的可能原因是,使用了自己生成了证书后,客户端发现证书无法与系统可信根CA形成信任链,出现了 CertificateException等异常。

    这种做法可能导致的问题是中间人攻击。

    在钓鱼WiFi网络中,同样地,攻 击者可以通过设置DNS服务器使客户端与指定的服务器进行通信。攻击者在服务器上部署另一个证书,在会话建立阶段,客户端会收到这张证书。如果客户端忽略 这个证书的异常,或者接受这个证书,就会成功建立会话、开始加密通信。但攻击者拥有私钥,因此可以解密得到客户端发来数据的明文。攻击者还可以模拟客户 端,与真正的服务器联系,充当中间人做监听。

    解决问题的一种方法是从可信CA申请一个证书。但在移动软件开发中,不推荐这种方法。除了申请 证书的时间成本和经济成本外,这种验证只判断了证书是否CA可信的,并没有验证服务器本身是否可信。例如,攻击者可以盗用其他可信证书,或者盗取CA私钥 为自己颁发虚假证书,这样的攻击事件在过去两年已有多次出现。

    事实上,移动软件大多只和固定的服务器通信,因此可以在代码中更精确地直接验 证是否某张特定的证书,这种方法称为“证书锁定”(certificate pinning)。实现证书锁定的方法有两种:一种是前文提到的实现X509TrustManager接口,另一种则是使用KeyStore。具体可参考 Android开发文档中HttpsURLConnection类的概览说明。

    使用短信注册账户或接收密码

    也有软件使用短信进行通信,例如自动发送短信来注册、用短信接收初始密码、用短信接收用户重置的密码等。

    短 信并不是一种安全的通信方式。恶意软件只要申明了SEND_SMS、RECEIVE_SMS和READ_SMS这些权限,就可以通过系统提供的API向任 意号码发送任意短信、接收指定号码发来的短信并读取其内容,甚至拦截短信。这些方法已在Android恶意代码中普遍使用,甚至2011年就已出现拦截并 回传短信中的网银登录验证码(mTANs)的盗号木马Zitmo。

    因此,这种通过短信注册或接收密码的方法,可能引起假冒注册、恶意密码重置、密码窃取等攻击。此外,这种与手机号关联的账户还可能产生增值服务,危险更大。较好的实现方式还是走Internet。

    密码和认证策略

    明文存储和编码存储密码

    许多软件有“记住密码”的功能。如果开发者依字面含义将密码存储到本地,可能导致泄漏。

    另 外,有的软件不是直接保存密码,而是用Base64、固定字节或字符串异或、ProtoBuf等方法对密码编码,然后存储在本地。这些编码也不会增加密码 的安全性。采用smali、dex2jar、jd-gui、IDA Pro等工具,攻击者可以对Android软件进行反汇编和反编译。攻击者可以借此了解软件对密码的编码方法和编码参数。

    较好的做法是,使用基于凭据而不是密码的协议满足这种资源持久访问的需求,例如OAuth。

    对外服务的弱密码或固定密码

    另一种曾引起关注的问题是,部分软件向外提供网络服务,而不使用密码或使用固定密码。例如,系统辅助软件经常在WiFi下开启FTP服务。部分软件对这个FTP服务不用密码或者用固定密码。在开放或钓鱼的WiFi网络下,攻击者也可以扫描到这个服务并直接访问。

    还有弱密码的问题。例如,早期Google钱包的本地访问密码是4位数字,这个密码的SHA256值被存储在内部存储中。4位数字一共只有10000种情况,这样攻击软件即便是在手机上直接暴力破解,都可以在短时间内获得密码。

    使用IMEI或IMSI作为唯一认证凭据

    IMEI、IMSI是用于标识手机设备、手机卡的唯一编号。如果使用IMSI或IMEI作为用户认证的唯一凭据,可能导致假冒用户的攻击。

    首先,应用要获取手机的IMEI、手机卡的IMSI并不需要特殊权限。事实上,许多第三方广告库回传它们用于用户统计。其次,得到IMEI或IMSI后,攻 击者有多种方法伪造成用户与服务器进行通信。例如,将原软件重打包,使其中获取IMEI、IMSI的代码始终返回指定的值;或修改Android代码,使 相关API始终返回指定的值,编译为ROM在模拟器中运行;甚至可以分析客户端与服务器的通信协议,直接模拟客户端的网络行为。

    因此,若使用IMEI或IMSI作为认证的唯一凭据,攻击者可能获得服务器中的用户账户及数据。

    组件间通信

    组件间通信的安全问题是Android所独有的,也是目前软件中最常出现的一种问题。

    我们先回顾一下组件间通信机制。Android有四类组件:activity、service、broadcast receiver和content provider。在同一个软件之中或不同软件之间,前三种组件使用Intent相互调用,使用ContentResolver对象访问content provider,共同实现软件的功能。使用Intent,可以显式或隐式地调用:

    • 显式(explicit):调用者知道要调用谁,通过组件名指定具体的被调用者;
    • 隐式(implicit):调用者不知道要调用谁,只知道执行的动作,由系统选择组件处理这个请求。

    如下面的代码所示:

    无论是显式还是隐式,如果要跨应用调用,还需要被调用的组件是对外暴露的。默认情况下,service、broadcast receiver和content provider是暴露的,申明了Intent-filter的actvity也是暴露的。

    抽象地说,组件A要调用组件B,以期待B完成某个功能;它可以发送一些数据给组件B,也可以获得B执行后的返回结果。在这个模型中,问题出现在A和B之间不一定互相可信。

    如果B是暴露的,任何软件都可以调用它,包括攻击者编写的软件。攻击者可能但并非总能成功:

    • 直接调用暴露的B,以获得其执行结果;
    • 构造特定的数据,并用于调用暴露的B,从而试图影响B的执行;
    • 调用暴露的B,并获取它执行完返回的结果。

    如果A用的是隐式调用,任何软件都可以实现它的action从而响应调用。攻击者可能(但并非总能成功):

    • 构造伪造的组件C,响应A的Intent,以读取A要发给B的数据;
    • 构造伪造的组件C,响应A的Intent,弹出虚假的用户界面以展开进一步攻击(例如钓鱼);
    • 构造伪造的组件C,响应A的Intent,返回伪造的执行结果。

    这样说可能比较抽象。下面我们对这两种情况分别讨论。

    组件暴露的问题

    看一个例子。在一个第三方深度定制的ROM中,预装了名为Cit.apk的软件,用于手机的硬件测试。它的AndroidManifest.xml局部如下:

    可以看到,它申明一个名为.CitBroadcastReceiver的receiver,响应名为android.provider.Telephony.SECRET_CODE的action,并且指定了URI格式。

    再来看这个receiver的代码片段(下面的代码是我反编译得到的,不一定与软件源码完全一致):

    可以看到,当调用这个receiver,并且提供的URI中host字段为284时,会以root权限调用本地的bugreport工具,并将结果输出至m_logFileName指定的文件中。

    默认情况下receiver是暴露的,因此这个receiver可以被其他软件调用,代码如下:

    当这四行代码执行时,就会触发CitBroadcast-Receiver的那段代码。从上下文看,输出文件m_logFileName位于SD卡,任何软件都可以随意读写。因此,攻击者可以获得bugreport的输出结果,其中包含大量系统数据和用户数据。

    请注意,在这个例子中,攻击者的软件不需要任何特殊权限,尤其是不需要root权限。这种由于组件暴露获得额外权限的攻击,被称之为permission re-delegation(权限重委派)。

    怎么避免由于组件暴露产生的安全问题?有的组件必须暴露,例如入口activity,或者确实对外提供服务或跨软件协作;但也有的组件没必要暴露。接下来我们分别讨论。

    不需要暴露的组件

    再次回顾,默认情况下,service、broadcast receiver和content provider是暴露的,申明了Intent-filter的actvity也是暴露的。如果它们只被同一个软件中的代码调用,应该设置为不暴露。很容

     

    Lasted greasy my the

    embassyofperu.org weren’t purchase night ll cialis online the live! Hold expensive. Box cialis real low prices Moisturizer French enough viagra for cheap as t hair,.

    易做到—在AndroidManifest.xml中为这个组件加上属性android:exported=”false”即可。

    需要暴露的组件

    如果组件需要对外暴露,应该通过自定义权限限制对它的调用。

    首先,在实现了被调用组件的软件的Android-Manifest.xml中自定义一个权限:

    接下来,为被调用组件添加这个权限限制,即在AndroidManifest.xml中为这个组件添加android:permission属性:

    另一种方法是在组件的实现代码中使用Context.checkCallingPermission()检查调用者是否拥有这个权限。

    最后,要调用这个暴露的组件,调用者所在的软件应该申明使用这个权限,即在AndroidManifest.xml中添加相应的use-permission申明。

    进一步地,还可以将这种组件暴露的需求分为两种情况。

    • 如果这个组件只打算给自己开发的其他软件使用,而不希望暴露给第三方软件,在定义权限时,protectionLevel字段应该选择signature。 这种设置要求权限使用者(即调用者)与权限定义者(即被调用者)必须由相同的证书进行签名,因此第三方无法使用该权限,也就无法调用该组件。
    • 如果这个组件要暴露给第三方,则protection-Level应使用normal或dangerous。此时,任何软件都可以使用该权限,只在安装时会 通知用户。考虑到用户一般会忽略权限提示,此时自定义权限实际失去了保护效果,我们依然要仔细审查该组件的代码,避免出现能力泄露或权限重委派等问题。

    此外,对content provider,可以更细粒度地为读取数据和写入数据设置不同的权限,对应的manifest标签分别为android:readPermission和android:writePermission。

    隐式调用的问题

    隐式调用的主要问题是被劫持,或Intent携带的数据被读取。

    为了劫持调用,攻击者可以实现一个恶意的组件,申明相同的Intent-filter。在多个组件都可以响应同一个Intent的情况下,如果是调用 activity,系统会弹出界面要求用户对多个软件做出选择,攻击者可以模仿真实软件的图标和名称吸引用户点击;如果是调用service,系统会随机 选择一个service;如果是调用receiver,系统会逐一地将Intent发给这些receiver。

    劫持了调用后,攻击者可以(但并非总能成功):

    • 启动一个虚假的软件界面,展开钓鱼攻击(例如要求用户输入账户密码)
    • 读取Intent携带的数据
    • 拦截broadcast的进一步发送,导致真正的receiver无法收到消息,从而拒绝服务
    • 如果是用startActivityForResult()调用了虚假的activity,可以返回恶意或虚假的结果给调用者
    • 执行其他恶意代码

    限于篇幅,对这些情形我们不提供示例代码。来看一下怎么解决这类问题。

    不需要隐式调用

    除了基于Intent类中已有ACTIONs的隐式调用,绝大部分隐式调用都属于这两种情况:同一软件中不同组件的调用;同一开发者不同软件间的调用。

    这两种情况下,事实上,开发时都已可以确定要调用的组件是哪个。因此可以避免隐式调用,改为基于组件名的显式调用。

    需要隐式调用

    发送broadcast除了使用sendBroadcast(Intent),还有一个方法是sendBroadcast(Intent, String),它的第二个参数可以指定接受者需要的权限。

    如果是调用activity或者service,目前我所知,还没有简单的方法实现接收者的权限限制。在Android文档中提出可以自定义Binder和AIDL实现通信双方的互相验证,但真正实现并不容易,也不为官方所推荐。

    数据验证

    无论是客户端还是服务器,在处理外部获得的数据之前,都应先判断和验证数据的有效性。这里主要指是否包含畸形的数据。

    在 Web开发中,服务器需要对用户提交的数据进行有效性验证,否则很容易出现众所周知的SQL注入等攻击。在移动开发中也不例外。虽然客户端与服务器在底层 通信协议上对用户是透明、不可见的,但开发者不应因此就假设双方传输的数据永远会和预先设计的一致。类似的,在读取用户从UI元素输入的输入、读取存储在 本地的数据后,使用前也应进行有效性验证。

    软件版权保护

    攻击者对Android软件进行逆向分析,除了寻找其中的安全漏洞,还可以直接攻击软件本身。

    • 破解软件的收费机制、License验证或功能限制;
    • 修改软件代码,去掉广告库,或者修改广告库(一般是改变推介ID字段),或者增加广告库,然后重新打包并分发;
    • 重新打包,植入恶意代码并分发;
    • 逆向分析,学习软件特色功能的实现方法,或者获得可复用的代码;

    可以采取多种措施来增加破解、修改和逆向分析的难度,减少被攻击的可能。这些措施包括:

    • 使用代码混淆工具,例如SDK带的ProGuard以及其他Java混淆器。
    • 采用NDK开发核心模块。
    • 使用官方或第三方的软件保护方案,例如SDK的android.drm包、Google Play的软件许可(Application Licensing)支持。
    • 去掉开发时的调试代码,关闭调试开关,删除多余的Log代码。

    然而,采取了这些措施并不等于就万无一失了。例如,用NDK开发的Native代码,也可以使用IDA Pro及其插件来反汇编、反编译和调试;用Google的DRM方案,也有AntiLVL这样的破解工具。理论上,现有防御手段都可能找到方法继续攻击, 其价值只是提高攻击难度和成本。

    总结

    已出现和将要出现的威胁

    到 目前为止,在学术研究以外,针对Android软件漏洞的攻击只出现一起—劫持国外多个社交网站客户端登陆会话的黑客工具FaceNiff。但随着攻击者 制造传播恶意代码的成本增加和收益降低,以及移动终端隐私数据逐渐成为地下产业链的交易资源,针对Android流行软件漏洞的攻击在未来几年之内几乎一 定会出现并爆发。

    统一的安全模型

    限于篇幅,本文只介绍了几种常见且简单的安全问题,还存在许多我们知道的、还不知道的漏洞。如何找到和解决这些问题?

    回顾已介绍的内容,我们可以发现它们有类似的安全模型:通信双方的信任问题。

    • 在数据存储中,读写数据的代码和存储在本地的数据互相不可信。
    • 在数据通信中,发送者和接受者互相不可信。
    • 在登录认证中,发起认证请求的用户的和接受认证请求的服务器互相不可信。
    • 在组件间通信中,发起Intent的组件与接收Intent的组件互相不可信。
    • 在数据验证中,处理数据的模块不能相信产生数据的源。

    面对将来的问题,我们也可以尝试抽象出这种模型,区分互相不可信的实体,然后在不可信、不安全的基础上,尽可能地实现相对的可信和安全。

    进一步学习和行动

    Android 的开发文档Best Practices: Designing for Security和源码文档Tech Info: Security分别从开发和系统实现的角度介绍了系统的安全机制。另外,viaForensics提供了名为42+ Best Practices: Secure mobile development for iOS and Android的在线教程,更详细地介绍了移动软件面临的安全威胁,并给出了安全开发实践策略。

    社区方面,从Android安全开发的角 度,Stack-Overflow并不一定是很好的选择—其中一些最佳回答没有考虑安全,直接使用可能产生问题。Google Group的anroid-security-discuss讨论组则更为专业和准确。OWASP成立了一个Mobile Security工作组,目前已发布Top Ten Mobile Risks等多份白皮书,并举办了AppSec会议。这个工作组的效率虽然不高,但产出质量非常棒。

    学术方面,2011和2012年的四大会议及其work-shop上均有移动软件漏洞挖掘和攻击阻止的论文出现,从它们的related works部分可以综合快速地了解学术界的思路。

    目前的移动开发还没有形成如此成熟的体系,这也许与其轻快敏捷的互联网产品开发风格有关。但我相信,真正实效的移动软件安全开发,最终依然会融合到需求分析、系统设计、开发实现、测试验证、部署运维等每一个环节,从而与PC平台的SDL殊途同归。

    作者肖梓航,网名Claud,安天实验室高级研究员,主要方向是移动反病毒和移动软件安全,发起或参与了多个移动安全开源项目。博客:http://claudxiao.net 

    展开全文
  • CISD国家注册信息安全开发

    千次阅读 2017-08-22 16:14:53
    【课程背景和目标:满足国家注册信息安全开发人员资质评定】 中国信息安全测评中心创立于1997年,是我国专门从事信息技术安全测试和风险评估的权威职能机构。依据中央授权,测评中心的主要职能包括:负责信息技术...

    【课程背景和目标:满足国家注册信息安全开发人员资质评定】

    中国信息安全测评中心创立于1997年,是我国专门从事信息技术安全测试和风险评估的权威职能机构。依据中央授权,测评中心的主要职能包括:负责信息技术产品和系统的安全漏洞分析与信息通报;负责党政机关信息网络、重要信息系统的安全风险评估;开展信息技术产品、系统和工程建设的安全性测试与评估;开展 信息安全服务和专业人员的能力评估与资质审核;从事信息安全测试评估的理论研究、技术研发、标准研制等。英文名称为:China Information TechnologySecurity Evaluation Center,简称:CNITSEC。

    注册信息安全开发人员(CertifiedInformation Security Developer,简称 CISD)认证,由中国信息安全测评中心实施,面向信息系统研发领域的工作人员,通过该培训将使相关人员熟悉软件安全开发的背景和过程,掌握软件安全开发各阶段的目的、主要任务和技术手段。CISD 证书持有人主要从事信息系统软件编码、软件测试、软件集成、 软件架构设计等软件开发相关工作,在全面掌握信息安全基本知识技能的基础上,具有较强的信息系统安全开发能力、熟练掌握应用安全。CISD系经中国信息安全测评中心认定的信息安全开发人员,具备一定的软件安全开发知识和技术,能为软件全生命周期中提供安全保障。中国信息安全测评中心授权培训机构!

    “汇哲科技”(简称“汇哲科技”或“SPISEC”)由北京汇哲信安科技有限公司、上海汇哲信息科技有限公司等多个独立公司所组成,专注于IT治理、信息安全、IT审计、IT服务管理、业务连续性、项目管理等领域国际最新理念良好实践的培训与服务,始终以培养信息安全专业人才,组织信息安全人才交流为发展目标。作为领先的专业培训服务机构,汇哲科技致力于推广信息安全理论和实践,为学员提供“学习国际知识、拓宽职业道路、融入专业社区、持续提升能力”的服务。

    汇哲科技作为唯一一家以信息安全培训与后续保障服务为主的机构,整体培训着重于实践和服务质量的精细、实用及持续化。讲师均具备十年以上实践经验,并长年致力于信息安全培训与实践工作,具备资深的专业培训水平和丰富的实战经验。汇哲科技专业、强大的后续服务团队专为学员随时解决考试认证、工作实践、企业指导等问题。结合多年培训与实践经验,汇哲科技制定的“汇哲培训服务三维体系”、“企业信息安全人才培养规划”、“企业信息安全意识宣贯”、“企业信息安全攻防演练平台”、“企业培训评估检验平台”深受企业认可。汇哲科技将以培训为基础、实践为目的、后续服务为保障,持续有效地为企业、个人及第三方合作伙伴提供优质的服务。

    汇哲科技于2007年开始在业内陆续组织多场专业知识学习讲座和研讨会,并持续提供大量专业学习期刊、安全通报、培训书籍、视频课件、意识动画、攻防环境和在线平台等服务。汇哲科技迄今为止已为30000多名会员提供免费的学习指导服务,并已为4000多名学员直接提供培训辅导、认证考试、攻防竞赛、人才规划、人员测评、意识宣贯等服务。学员分布在政府、央企、国企、金融、运营商、能源、制造、互联网等多个行业。

    【课程收益:全面梳理信息安全开发知识精髓,解决实际问题,结识行业精英】

    1.   通过8天系统的知识点学习,帮助学员梳理学习思路,顺利通过CISD认证考试;

    2.   满足我国网络基础设施和重要信息系统的软件开发人员安全开发能力实施的一种资质评定;

    3.   官方授权培训机构、独立的后续服务团队,为学员的认证和实践指导提供持续服务;

    4.   多年的信息安全领域的专业培训经验,满足学员目前各个岗位的实践指导。

    【课程特色:实践融合,而不仅仅是学习知识】

    1.   实践融合,解决知识落地的问题:需要的不仅是学习,而是解决学员在信息安全与技术实践中的问题。因此,在提供系统课程学习的同时,特设“实践融合”,在传递知识的同时,更提供课堂外的学习,针对实践中的问题,多维度、多视角地探索解决思路,整理得出具体的解决方案,真正实现“带着问题来,带着实践走”的目标。

    2.   综合性的服务平台,解决资源整合的问题:汇哲即有经典、高价值的信息安全各类课程,还是中国信息安全测评中心,联合国训练研究所亚太地区信息安全培训部,国际信息安全学习联盟,等众多平台的参与者,并参与国家外事部援外信息系统培训、IT审计培训等工作。因此,学员可以借助这个平台整合资源,直接为个人职业发展和工作实践注入关键资源,帮助学员持续解决实际问题,快速提升竞争力。

    【适合对象】

    ² IT总监/经理;信息安全经理;

    ² 项目经理;软件项目经理;

    ² 软件架构师;软件工程师;

    ² 软件开发工程师;

    ² 应用程序安全专家;软件采购分析员;

    ² 渗透测试人员;质量保证测试员;

    ² 其他从事信息安全开发工作的有关人员。

    ²  【课程结构:学习系统知识,解决实际问题】

    1、信息安全保障基础

    信息安全保障背景

    信息安全保障原理

    典型信息系统安全模型与框架

    信息安全保障工作概况

    信息安全保障工作基本内容

    2、信息安全法规与政策

    信息安全相关法律

    信息安全相关政策

    3、信息安全标准

    安全标准化概述

    信息安全相关标准

    信息安全评估标准

    4、访问控制

    访问控制模型

    访问控制技术

    5、密码学基础

    密码学概述

    密码学算法简介

    6、网络安全

    网络协议安全

    网络安全设备

    7、系统安全

    操作系统安全

    数据库安全

    8、信息安全风险管理

    风险管理工作内容

    信息安全风险评估实践

    9、 信息安全工程原理

    安全工程理论背景

    安全工程能力成熟度模型

    10、 软件安全开发基础

    软件安全开发基本概念

    软件安全开发生命周期

    11、安全需求分析

    需求概述

    安全需求工程

    安全需求分析方法

    威胁建模

    12、软件安全设计

    软件设计及安全设计原则

    软件安全设计方法

    13、软件安全编码

    软件安全编码基础

    典型安全缺陷及防御措施

    14、软件安全测试

    软件安全测试简介

    软件安全测试的关键工作

    15、软件安全部署与开发项目管理考前复习

    软件安全部署

    软件安全开发项目管理

    考前复习知识梳理串讲

    【授课师资:官方授权讲师与实战专家 强强联合】

    贺老师

    国家信息安全测评中心认证信息安全工程师(CISP)、国家信息安全测评中心认证CISP讲师(CISI)、某知名信息安全公司攻防实验室高级安全研究员,反病毒技术研究员。专长于源代码安全审计、恶意代码分析与防范、信息安全漏洞分析与防范等。曾参与天津移动、国家外汇管理局、安徽省经信委、某运营商、某银行、某电网CISP培训课程与信息安全技术培训。

    蒲老师

    国家信息安全测评中心CISP认证讲师。多年的IT从业经验,先后参与了华南、华北区包括各个电信、移动、联通及政府多个项目,熟悉电信行业、大企业各类业务系统和应用环境。

    精通安全顾问理论,包括为企业实施资产安全管理、风险评估、风险管理和处置、文档管理、业务持续性计划以及法律符合等。熟悉业界安全各种安全技术,包括防火墙、入侵检测、加密和认证、防病毒、安全管理、日志监控、黑客攻击和防护等,并熟悉相应主流厂商的产品。

    多年的IT培训经验,期间授课千家企业,学员近万人,深受好评。

    【持久后续服务保障:受益终生的学习平台】

        为丰富课程体系,帮助同学持续地学习到最新、最实用的内容,汇哲以培训服务为体系,对所有学员提供持久有效的后续服务:“国际信息安全学习联盟VIP权限(终身有效)、信息安全实践研讨、原创书籍、邮件组、信息安全通报、学习月刊、信息安全意识海报、屏保、信息安全实践工作指导等”免费服务。

    展开全文
  • 安全软件开发入门(教程)

    千次阅读 2008-05-31 12:01:00
    摘要:本人近日对安全软件开发颇感兴趣,于是在作比较深入的研究后,写下此文,与大家一起共享、讨论。安全软件开发入门:描述了在软件开发中需要重视的安全问题,并介绍了两种安全开发模式——微软的“威胁模式”和...

    摘要:

    本人近日对安全软件开发颇感兴趣,于是在作比较深入的研究后,写下此文,与大家一起共享、讨论。安全软件开发入门:描述了在软件开发中需要重视的安全问题,并介绍了两种安全开发模式——微软的“威胁模式”和Gary McGraw提出的“接触点模式”。最后提出了实用的安全Web开发“药方”:从系统架构师、开发人员、系统维护人员的角度出发讨论安全web开发的实用方案。
    安全软件开发入门

    作者: cleverpig


    软件安全问题

    有趣的《黑客帝国》终极解释:

    image

    《黑客帝国》故事里面的人物关系,就像电脑里面的各种程序的关系一样:
    电脑里面的系统程序:Matrix;
    病毒程序:以Neo为首的人类;
    防病毒软件:Agent特工、机器章鱼、先知(迷惑和引导病毒程序的);
    以及出错程序:Smith和Merovingian。

    第一集:病毒程序入侵Matrix,唤醒被隔离的病毒源代码Neo,并通过破坏Agent特工这些防毒软件取得控制部分机器系统的胜利。

    第二集:讲述Matrix系统通过蒙骗的方法将Neo等病毒代码或受感染的程序收集引导到一个Zion区域,进行杀毒,结果在片尾,病毒程序Neo意识到了这一点。

    第三集:Matrix系统软件通过利用Agent防病毒软件和Smith出错程序来对付Neo这些病毒程序,并且成功地消灭了这两方,达到系统防御能力升级。

    其实故事一开头就注定了Neo的悲剧结局和人类的失败。因为病毒如果最后导致系统崩溃,病毒也将被消灭。所以病毒要不被系统消灭,要不导致系统崩溃,和系统一起灭亡。

    软件安全问题的根源:

    内因:软件有错误
            * 脆弱点
                    * 缺陷(设计层)
                    * Bug(实现层)
            * 软件开发方法存在问题
    外因:软件的运行环境
            * 网络对软件的发展产生了巨大的影响(负面居多)
    外部环境:黑客、恶意代码
    内部环境:误操作、报复、经济犯罪

    7+1的软件安全问题领域:

    1.输入验证和表示法
    2.滥用API
    3.安全特性
    4.时间和状态
    5.错误处理
    6.代码质量
    7.封装
    *.环境

    1.输入验证和表示法

    输入验证和表示问题由元字符、替换编码、数字表示法引起。如果选择使用输入验证,那么就要使用白列表、而不是黑列表。
    由于轻信输入而造成的大问题包括:缓冲区溢出、跨站脚本攻击、SQL注入、缓存毒药和其它脚本小子们非常轻易吃到的“低挂的果实”(这里只安全性较低的软件设计)。

    2.滥用API

    API规定了调用者和被调用程序之间的使用约定。滥用API的常见模式是由调用者错误地信任被调用方造成的。例如,调用者希望从被调用程序那里返回获取用户信息,而被调用程序并没有任何的安全性保证其信息的可靠性。于是调用者就假定了调用程序返回数据的正确性和安全性。当然,也存在“坏人”有意破坏调用者-调用程序之间约定的行为。

    3.安全特性

    软件安全不是安全软件。世界上所有的加密算法都不能满足真正的安全需要。尽管使用SSL保护网络流量的手段,而认证、访问控制、机密性保障、加密算法、权限管理等都可能存在着安全缺陷。

    4.时间与状态

    分布式计算与时间和状态相关。为了使多个组件进行通信,状态必须在组件之间共享,而所有这些都需要花费时间。因此在时间和状态之间可能存在着巨大的、未发现的天然攻击资源。
    多数开发者人格化了他们的工作(将程序看作“它”的单体)。他们自以为单一、全能的控制线程能够孜孜不倦地日夜工作,以同一种方式支撑整个应用。而现代计算机在任务之间切换速度与日俱增,并且多核、多CPU或者分布式系统的应用使两件事情完全可以在同一时间发生。因此缺陷便出现在开发者所设想的程序执行模型和实际情况之间的差异中。这些缺陷与在线程、进程、时间和信息之间的无法预期的交互相关。而这些交互往往通过共享状态发生:信号、变量、文件系统、全局信息等。

    5.错误处理

    如果想破坏软件,那么就让它抛出一下垃圾数据,并看看你导致了哪些错误。在现代面向对系统中,异常的想法取代了被禁止的goto概念。
    与错误处理相关的安全缺陷在开发中很常见。在API被滥用的情况下,安全缺陷主要存在于两种方式:第一,开发者忘记处理错误或者粗略得处理错误;第二,在产生错误时要么给出过于详细的信息,要么错误过于太具放射性以至于没有可处理它们的方式。

    6.代码质量

    安全是可靠性的子集。如果可以完整地描述你的系统和其存在的正面、负面的安全可能性,那么安全成为了可靠性的子集。劣质代码将导致无法预期的行为,从软件使用者的观点,它将被认为是很差的可用性;而从攻击者的视角看,糟糕的代码将提供给系统施压的可乘之机。

    7.封装

    封装是指在事物之间的边界和它们之间建立的界限。在web浏览器中,它确保了移动代码不能够强行我们的硬盘攻击。在web服务端,它意味着在经过认证的有效数据和私密数据之间的差别。这里的边界非常重要,如今在类之间的一些方法构成了重要的边界,因此信任模式需要谨慎的设置。

    8.环境

    这是上面七种领域的外部领域,它包括在代码外部的所有东西,并对于我们建立的软件安全同样重要。

    十大web安全问题:

    1.未验证输入

            问题描述:web 请求信息在被Web应用使用之前都是未验证的,攻击者能够利用其中的弱点攻击服务器;攻击者通过伪造HTTP请求的各个部分,例如URL,查询字符串,头,cookies,表单域,隐藏域等绕过站点的安全机制。
            这些常见的伪造输入攻击通常包括:强制浏览,命令插入,跨站脚本,缓冲区溢出,格式化字符串,SQL注入,cookie中毒,隐藏域操作等等。
            保护方法:过滤恶意输入;客户端输入验证、服务器端验证。

    2.破坏访问控制

            问题描述:对认证用户能够进行的操作缺乏合理的限制。攻击者利用其中的缺陷访问其他用户的账户,浏览敏感文件,或使用未授权的功能。
            保护方法:
            加强对会话的保护(会话ID);
            防止暴力浏览绕过访问控制检查;
            合理设置访问权限;
            禁止客户端缓存。

    3.破坏认证和会话管理

            问题描述:账户信用和会话令牌没有被合理保护,攻击者能够危及密码、密钥、会话cookies或其他限制而冒用他人的账户
            保护方法:
            加强密码强度;
            限制登录次数;
            使用SSL保护传输中的认证信息;
            使用SSL保护会话ID;
            禁止客户端缓存。

    4.跨站脚本缺陷

            问题描述:web应用能被利用将攻击转送到端用户的浏览器。成功的跨站攻击能够暴露用户的会话令牌,攻击本地计算机或者用虚假信息欺骗用户。
            保护方法:
            对用户提供的输出进行编码;
            根据白列表,严格验证查询字符串;
            过滤、清除页面请求中的活动内容。

    5.缓冲区溢出漏洞

            问题描述:Web应用组件可能存在缓冲区溢出漏洞,对它的攻击会造成严重的攻击后果。这种漏洞是由于CGI,库函数,驱动程序、应用服务器组件等没有合理地验证输入。
            保护方法:
            密切跟踪Web应用产品的最新错误报告,及时打补丁;
            使用漏洞扫描工具定期对系统进行缓冲区溢出漏洞扫描;
            严格审查Web应用程序中从用户请求接收数据的代码,确保对缓冲区长度进行了检查。

    6.注入缺陷

            问题描述:Web应用在访问外部系统或本地操作系统时需要传递参数,这些参数可能会被攻击者利用嵌入恶意代码,这样导致外部系统能以应用服务器的权限执行系统命令。
            保护方法:
            避免使用外部解释器;
            对于涉及到的后台数据库调用,应对数据进行严格验证;
            将Web应用程序设置为能满足需要的最小权限运行;
            不得不使用外部命令时进行严格检查;
            应该检查调用的所有输出、返回代码和错误代码,最低限度要能确定何时发生了错误。

    7.不合理的错误处理

            问题描述:正常操作中的错误条件没能合理处理,如果攻击者使Web应用产生未作处理的错误,就能得到具体系统信息,使安全机制失效,使服务器崩溃。
            保护方法:
            设计合理的错误处理策略并作好文档,包括要处理的错误类型、错误提示信息、日志需记录的信息;
            处理所有可能的错误,但不暴露不该暴露的细节;
            遇到重复的错误尝试时发出警告。

    8.不安全存储

            问题描述:Web应用经常使用加密函数保护信息和身份证明,这些函数和保护其完整性的代码很难完全正确地实现,从而导致弱保护问题。
            保护方法
            除非必要,尽量少保存数据;
            存储密码的摘要(例如SHA-1)而非加密的密码;
            必须使用加密算法时,尽量采用公开的密码算法库。并妥善存储秘密信息,如密钥、证书、密码等。

    9.拒绝服务

            问题描述:攻击者能够消耗Web应用的资源,使其无法正确为合法用户服务,或封闭用户账户甚至使服务瘫痪。
            保护方法:
            限定分配给每个用户最少量的资源;
            限制每个合法用户仅有一个连接,并采用适当的丢弃部分请求的策略;
            避免非认证用户对数据库或其他关键资源的非必要访问;
            使用内容缓存的方法减少对数据库的访问。

    10.不安全配置管理

            问题描述:对服务器合理配置是实现安全性的重要因素,服务器通常都有损害安全性的不合理配置。
            保护方法:
            为特定服务器和Web服务器建立强化安全配置策略,关闭无用服务,建立角色、权限和账户,使用日志和告警措施;
            始终维护服务器的安全配置,跟踪最新安全漏洞,应用最新补丁,升级安全设置,定期漏洞扫描,定期进行内部审查。

    两种安全模型:

    微软的安全软件开发模型:

    1.安全开发生命周期(SDL):

    image

    SDL总计为四步:
    第一步:安全教育,通过教育才能提高安全意识。
            设计人员:学会分析威胁
            开发人员:跟踪代码中每字节数据、质疑所有关于数据的假设
            测试人员:关注数据的变化
    第二步:设计阶段,利用威胁建模技术建立系统模型。
    第三步:开发阶段,编码与测试并行。
    第四步:发行与维护阶段,使用标准的修复机制修复安全缺陷。

    2.威胁建模:

    威胁模型是一种基于安全的分析,有助于人们确定给产品造成的最高级别的安全风险,以及攻击是如何表现出来的。
    其目标是确定需要缓和哪些威胁,如何来缓和这些威胁。

    主要分为四个步骤:

    第一步:分解应用程序。使用DFD(数据流图)或者UML(统一建模语言)描述威胁模型,作为分析应用程序的重要组成部分。对应用程序进行形式化分解,自顶向下,逐层细化,在分解过程中关注过程之间的数据流。
    例如:
    image
    第二步:确定系统面临的威胁。按照“STRIDE”威胁模型:
            S:身份欺骗(Spoofing identity),造成冒充合法用户、服务器欺骗(DNS 欺骗,DNS缓存中毒)。
            T:篡改数据(Tampering with data)。
            R:否认(Repudiation)、。
            I:信息泄露(Information disclosure)。
            D:拒绝服务(Denial of service, DOS)。
            E:特权提升(Elevation of privilege)。

    第三步:威胁评估。按照“DREAD”算法为威胁分级,并建立攻击树:
            D:潜在的破坏性(damage potential)
            R:再现性(reproducibility)
            E:可利用性(exploitability)
            A:受影响的用户(affected users)
            D:可发现性(discoverability)
            例如:
            Threat #1: 恶意用户浏览网络上的秘密工资数据
            潜在的破坏性: 读取他人的私密工资并不是开玩笑的事。——风险值为8
            再现性:100%可再现。——风险值为10
            可利用性: 必须处于同一子网或者处于同一路由器下。——风险值为7
            受影响的用户: 每个人都将受到影响。——风险值为10
            可发现性: 让我们假设它已经发生。——风险值为10
            计算风险DREAD: (8+10+7+10+10) / 5 = 9

            攻击树描述了攻击者利用系统漏洞破坏各组件,对威胁目标进行攻击所经历的决策过程。建立攻击树需要考虑的几个方面:
            安全威胁:潜在的事件,当攻击有动机并付诸实施时,威胁转变为攻击事件。
            安全漏洞:系统中的弱点。
            资源:受威胁(或攻击)的目标。
            
            例如:
            对Threat #1的威胁描述表格:
    image

            Threat #1的攻击树:
    image
            
    第四步:建立缓和方案,选择适当的安全技术。

    image

    接触点开发模型:

    image

    根据有效性排列的接触点:
    代码审查(Code review)
    架构风险分析(Architectural risk analysis )
    渗透测试(Penetration testing )
    基于风险的安全测试(Risk-based security tests )
    滥用用例(Abuse cases )
    安全需求(Security requirements )
    安全操作(Security operations )

    1.代码审查

    代码审查的目标是找到bug,架构风险分析的目标是找到缺陷。在很多情况下,这两个主要的接触点的执行顺序能够交换。

    静态分析工具:
    静态分析工具在代码中查找固定的模式或规则集合。
    静态分析工具的输出仍然需要人为判断。
    错报(false negatives)问题,程序中含有bug但工具没有报告。
    误报(false positives)问题,工具报出的bugs程序中不存在。

    动态分析工具:
    执行程序、错误注入。

    二进制分析:
    反汇编和反编译都是攻击者最常用的黑客工具。
    例如:Fortify Source Code Analysis Suite
    image

    2.架构风险分析

    架构风险分析的主要活动是从适当的高度建立一个目标系统的视图,避免“只见树林不见森林”,提倡一页纸的总览, “forest-level”视图。
    例如:
    image

    在forest-level视图中主要分析以下几个方面:
    威胁(谁可能攻击系统)、每一层环境中的风险、每个组件和数据流中可能存在的漏洞、技术风险可能造成的商业破坏、风险被实现的可能性、任何在每一层能够实现的可行对策、考虑整个系统范围内的可用保护机制。

    3.渗透测试

    渗透测试,针对系统威胁尝试对系统进行渗透,包括:积极(正向)测试,验证软件正常执行了规定的任务;消极(负向)测试,安全测试人员必须深入研究安全风险(可能由滥用用例和体系风险驱动)以便确定系统在攻击之下如何反应。

    测试工具:
    错误注入工具。
    其他工具:Fortify Software, CANVAS。
    攻击者的工具包。

    4.基于风险的安全测试

    此测试旨在揭示可能的软件风险和潜在攻击。

    实施人员:
    使用传统方式的标准测试组织可以执行功能安全测试;
    基于风险的安全测试更依赖于专门技术和经验,而不是测试经验和安全经验;
    教会测试专业人员学会在测试时如何象一个攻击者一样思考。

    实施方式:
    有源码:白盒测试,静态分析--发现程序中的错误;
    根据基于对软件体系深入的理解而进行的风险分析的结论,进行白盒测试;
    无源码:黑盒测试,运行程序--恶意输入。

    5.滥用用例

    滥用用例指软件开发人员需要在正常特性之外思考软件系统的固有特性,如可靠性、安全和性能。

    实施方式:
    对系统的异常行为必须事先有所预期;
    象攻击者一样思考你的系统,利用“反需求”尝试出错点。
    例如:你的系统有一个使用加密保护通过序列化将关键数据写到磁盘上的安全需求,与这个需求对应的反需求就是要确定当缺少加密的时候会发什么情况。

    6.安全需求

    设计系统的安全需求。

    7.安全操作

    注重配置管理的安全性,由于配置的改变是必然的,因此我们在开发和维护过程中需要控制配置的改变,建立开发活动(程序、数据、文档)的快照,验证配置的任何修改,防止恶意修改配置。

    常用工具:
    Rational ClearCase,MS Visual SourceSafe等。

    实用的安全Web开发“药方”

    规划体系结构和设计解决方案时:

    识别和评估威胁:使用威胁建模系统地识别威胁,而不是以任意的方式应用安全性。接着,根据攻击或安全损害产生的风险和可能造成的潜在损失,对威胁进行评价。这样就可以适当的次序对威胁进行处理。

    创建安全的设计:使用尝试或检验过的设计原则。集中处理关键区域,在这些区域,方法正确是必须的,而且经常会出现错误。这里将它们称为应用程序缺陷类别。其中包括输入验证、身份验证、授权、配置管理、敏感数据保护、会话管理、密码系统、参数处理、异常管理和审核与日志记录各项。要特别注意部署问题,包括拓扑、网络基础设施、安全策略和步骤。

    执行体系结构和设计复查:应用程序设计的复查与目标部署环境和相关的安全策略有关。需要考虑底层基础设施层安全性(包括边界网络、防火墙、远程应用程序服务器等)带来的限制。使用应用程序缺陷类别帮助我们对应用程序进行分类,并分析适合于每个领域的方法。

    进行应用开发时:

    开发工具的安全性:充分了解开发工具(包括语言、虚拟机、IDE环境、引用的第三方工具包),最好选择开放源代码的开发工具,这样以便仔细审核其安全性。检查开发工具是否提供了用户和代码安全模型,是否允许对用户和代码可以执行的操作进行限制。如果开发中涉及公开对称和不对称的加密与解密、散列、随机数生成、数字签名支持等算法,最好选用可靠的公开算法,避免自己炮制算法。

    编写安全代码库:对程序集进行数字签名,使它们不能随意改动。通过遵守面向对象设计原理,减小程序集受攻击面,然后使用代码访问安全性,进一步限制哪些代码可以调用您的代码。使用结构化的异常处理方法防止敏感信息蔓延到当前信任边界之外,并开发更加可靠的代码。避免常规问题,特别是输入文件名和 URL 的问题。

    安全地处理异常:不要显示内部系统或应用程序的详细信息,如堆栈跟踪、SQL 语句片断等。确保这类信息不被允许蔓延到最终用户或当前信任边界以外。在异常事件中安全地“失败”,确保应用程序拒绝非法访问,而且没有停留在不安全的状态下。不记录敏感或私有数据,如密码,以免造成危害。在记录或报告异常时,如果用户的输入包括在异常消息中,对其进行验证或清理。例如,如果返回一个HTML错误消息,那么应该对输出进行编码,以避免脚本注入。

    执行第三方代码的安全复查:使用分析工具分析二进制程序集,确保它们符合安全设计准则,并修复分析工具识别出的所有安全缺陷。复查具体的应用程序元素,包括 Web 页面和控件、数据访问代码、Web 服务、服务组件等。要特别注意 SQL 注入和跨站点脚本编写缺陷。

    保证开发人员工作站的安全性:使用一套方法保证工作站的安全性。保证帐户、协议、端口、服务、共享、文件与目 录和注册表的安全。最重要的是,保持工作站具有当前最新的补丁与更新。例如如果在 Microsoft Windows_ XP 或 Windows 2000 上运行 Internet 信息服务 (IIS),则运行IISLockdown。IISLockdown 应用安全的IIS配置,并安装URLScan Internet 安全应用程序编程接口 (ISAPI) 筛选器,该筛选器用于检测和拒绝潜在的恶意 HTTP 请求。

    编写具有最低权限的代码:可以限制代码能够执行的操作,这与运行该代码所使用的帐户无关。通过配置策略或编写代码,可以使用代码访问安全性控制来限制代码允许被访问的资源和操作。如果代码不需要访问某种资源或执行某种敏感操作,可以安全性配置/控制来确保代码不会被授予这种权限。

    防止SQL注入:使用数据访问的参数化存储过程。使用参数要确保输入值的类型和长度都 得到检查。将参数视作安全文本值和数据库内的不可执行代码。如果不能使用存储过程,也可以使用带有参数的SQL语句。但不要通过连接SQL命令和输入值来构建 SQL 语句。还要确保应用程序使用具有最低权限的数据库登录,以限制它在数据库中的功能。

    防止跨站点脚本编写:对输入类型、长度、格式和范围进行验证,并对输出进行编码。如果输出包括输入(包括 Web 输入),则对输出进行编码。例如,对窗体字段、查询字符串参数、cookie等进行编码,以及对从无法确定其数据是安全的数据库(特别是共享数据库)中读取的输入进行编码。对需要以HTML返回客户端的自由格式的输入字段,对输出进行编码,然后选择性地清除在许可元素(如用于格式化的 <b> 或 标记)上的编码。

    管理机密:最好寻找避免存储机密的替代方法。如果必须存储它们,则不要在源代码或配置文件中以明文的方式存储。

    安全地调用代码接口:特别注意传递给接口和接口返回的参数,防止潜在的缓冲区溢出。验证输入和输出字符串参数的长度,检查数组边界,并特别小心文件路径的长度。

    执行安全的输入验证:对输入进行限制、拒绝和清理,因为验证已知有效类型、模式和范围的数据要比通过查找已知错误字符来 验证数据容易得多。验证数据的类型、长度、格式和范围。对字符串输入,请使用正则表达式。有时候可能需要对输入进行清理。一个例子是在对数据编码后清理编码元数据,以保证其安全性。

    保证页面访问身份验证的安全性:安全地划分Web站点,隔离匿名用户可以访问的公共可访问页面和需要身份验证访问的限制性页面。使用安全套接字层 (SSL) 来保护窗体身份验证凭据和窗体身份验证 cookie。限制会话生存时间和确保身份验证 cookie 只在 HTTPS 上传输。对身份验证 cookie 加密,不要在客户端计算机上保留它,也不要将其用于个性化目的;对个性化使用单独的 cookie。

    管理和维护系统时:

    实现补丁管理:针对Microsoft平台,那么可以使用 Microsoft Baseline Security Analyzer (MBSA) 检查当前安装可能漏掉的补丁和更新。定期运行该操作,保持服务器当前安装有最新的补丁和更新。在应用补丁前,对服务器数据进行备份;在将补丁安装在生产服务器上之前,先在测试服务器上进行测试。还要使用 Microsoft 提供的安全通知服务,并订阅通过电子邮件接收安全布告。针对Unix/Linux平台,可以 订阅有关漏洞及补丁的邮件列表,定期使用工具,检查服务器上安装的补丁是否与Unix/Linux厂商发布的最新补丁列表相一致。

    保证Web服务器的安全性:针对Microsoft平台上运行的IIS服务,可以使用IISLockdown应用安全的IIS配置,并安装URLScan Internet 安全应用程序编程接口 (ISAPI) 筛选器,该筛选器用于检测和拒绝潜在的恶意 HTTP 请求。针对Unix/Linux平台上运行的Apache服务,可以采用选择性访问控制(DAC)和强制性访问控制(MAC)的安全策略,或者安装安全相关的modules。针对WebService常用的协议(如soap),可以使用 XML 加密以确保敏感数据保持其私有性。使用数字签名保证消息的完整性,尤其重要的数据应使用SSL加密。最重要的是,保持服务器安装了当前最新的补丁和更新,并使其按照最小权限运行。

    保证数据库服务器的安全性:应用一种常见方法评估帐户、协议、端口、服务、共享、文件与目录和注册表。还要评估 SQL Server的安全设置,如身份验证模式和审核配置。评估身份验证方法和 SQL Server登录、用户与角色的使用。确保安装最新的服务包,定期监测操作系统和 SQL Server 补丁与更新。

    防止拒绝服务攻击:确保加强了服务器上的 TCP/IP 堆栈配置,以应对如 SYN flood 这样的攻击。对web服务的配置做适当的修改以限制接受的 POST 请求的规模,并对请求的执行时间做出限制。

    限制文件 I/O:可以配置代码访问安全策略,以确保限制单个程序集或整个 Web 应用程序只能访问文件系统。例如,通过配置运行在媒体信任级上的 Web 应用程序,可以防止应用程序访问其虚拟目录层次结构以外的文件。同时,通过为特定程序集授予受限的文件 I/O 权限,可以精确控制哪些文件可以被访问以及应该如何访问它们。

    执行远程管理:针对Microsoft平台,其终端服务提供了一种专用的协议 (RDP)。它支持身份验证,并可以提供加密。如果需要文件传输工具,可以从 Windows 2000 Server 资源包中安装文件复制实用工具。建议不要使用 IIS Web 管理,如果运行 IISLockdown 该选项将被清除。应该考虑提供一个加密的通信通道,并使用 IPSec 限制可以用于远程管理您的服务器的计算机。还应该限制管理帐户的数量。针对Unix/Linux平台,建议采用SSH进行远程管理,文件传输使用SFTP。

    参考资源:

    Microsoft Corporation的《编写安全的代码》第二版
    Gary McGraw编写的《Software Security: Building Security In》
    微软Web安全解决方案一览

    -----------------------------------------------------------------------------------------

    技术交流群:37304662

    本群主要交流技术为:PHP,CGI,SQL,MYSQL等Web编程相关技术、数据库.

    展开全文
  • 信息安全与网络安全的区别

    千次阅读 2019-10-16 08:55:23
    信息安全包括网络安全,信息安全还包括操作系统安全,数据库安全,硬件设备和设施安全,物理安全,人员安全,软件开发,应用安全等。 二、针对的设备不同 网络安全侧重于研究网络环境下的计算机安全,信息安全侧重于...
  • 信息安全基础知识

    万次阅读 2019-06-08 17:00:00
    网络信息安全基础知识 1 计算机网络 计算机网络是利用通信线路将不同地理位置、功能不相同的 计算机和通信设备连接起来,实现资源的共享和信息的...信息安全是指保护信息系统中的计算机硬件、软件和数据不因偶然或恶...
  • 信息安全

    千次阅读 2011-10-24 20:14:22
    信息安全本身包括的范围很大。大到国家军事政治等机密安全,小到如防范商业企业机密泄露、防范青少年对不良信息的浏览、个人信息的泄露等。网络环境下的信息安全体系是保证信息安全的关键,包括计算机安全操作系统、...
  • 软件系统产品信息安全功能点要求

    千次阅读 2018-10-15 09:35:06
    必须的安全要求: 账户管理方式 账户的产生、修改、变更、删除以及身份认证应采用统一的身份认证平台来实现。 认证失败后的处理方式设计,防止黑客暴力猜测。 连续失败登录后锁定账户。账户锁定后可以由系统管理员...
  • 信息安全相关事项指引 一、 软件开发过程安全 1、 了解公司在软件开发过程安全方面的管理制度,如:《软件开发安全控制程序》 2、 软件安全需求:软件开发项目的需求阶段应有安全性需求的分析与内容,建议在需求说明...
  • 软件安全概述

    千次阅读 2018-09-26 21:10:20
    1、软件安全关注的是计算机程序或程序中信息的完整性、机密性和可用性 2、软件安全缺陷: 1)软件自身的缺陷,设计者故意或过失 2)软件漏洞是基本的形态,而恶意代码是延伸的形体 3)软件中的客观存在 3、风险与...
  • 软件安全需求分析

    千次阅读 2020-12-30 19:10:33
    这是对软件开发工作能否取得成功的基础条件。 1、软件需求分析的主要工作 为了开发出满足用户需求的软件产品,首先需要知道的是用户的需求。这是对软件开发工作能否取得成功的基础条件。 1)确定系统的综合要求 ...
  • 1.3 信息安全管理基础 欢迎加入最棒的信息安全工程师社群,分享信息安全工程师备考干货资料。 备考交流QQ群:39460595 https://www.moondream.cn/?p=521 一.大纲要求 1.3.1 信息安全管理制度与政策 * 熟悉...
  • 信息安全期末复习整理

    万次阅读 多人点赞 2019-10-18 19:45:02
    信息安全期末复习整理。适用于韦老师2019《信息安全期末考试》。
  • 软件安全开发生命周期-基础理论

    千次阅读 2018-05-25 17:32:02
    一、SDL简介SDL security development lifecycle(安全开发生命周期),是微软提出的从安全角度指导软件开发过程的管理模式。SDL是一个安全保证的过程,起重点是软件开发,它在开发的所有阶段都引入了安全和隐私的...
  • 全国计算机信息安全技术

    千次阅读 2019-06-11 21:31:45
    了解信息安全保障工作的总体思路和基本实践方法  2. 掌握信息安全技术的基本概念、原理、方法和技术  3. 熟练掌握计算机网络安全、系统软件安全和应用软件安全的基本知识和实践技能  4. 掌握信息安全设备的...
  • 信息安全技术

    千次阅读 2010-03-07 09:48:00
    信息安全是指信息网络的硬件、软件及其系统中的数据受到保护,不受偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,信息服务不中断。信息安全是一门涉及计算机科学、网络技术、通信技术、密码...
  • 信息安全概论知识点

    千次阅读 多人点赞 2017-05-24 23:59:09
    信息安全概论知识点
  • 微软安全响应中心的禇诚云分享了他在软件安全漏洞与软件开发上的研究成果。以下为褚诚云讲演实录:褚诚云:大家好!我叫褚诚云,来自微软公司。我这个讲座可能跟其他人的讲座都有一点不一样,我是从产品开发的角度和...
  • SEED Labs信息安全实验

    万次阅读 2018-07-04 11:44:50
    1.1 SEED Labs 介绍 SEED Labs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理,可用于提高学生体验式学习的实验室练习。项目组2002年由杜文亮教授创建,目前开发了30个实验,涵盖了各种计算机...
  • 信息安全概论习题

    千次阅读 2021-01-02 22:13:18
    主要功能:攻击者获取活动主机、开放服务、操作系统、安全漏洞等关键信息 扫描技术:Ping 扫描(确定哪些主机正在活动)、端口扫描(确定有哪些开放服务)、操作系统辨识(确定目标主机的操作系统类型)和安全漏洞...
  • 企业信息安全的范围技术控制:访问控制:对权限、对账户的控制,例如:控制某个账户可以访问某个系统或者不可以访问某个系统网络安全:局域网、广域网、城域网、交换机的配置、防火墙配置、路由器配置等等系统安全:...
  • 计算机三级信息安全知识点

    万次阅读 2021-03-26 19:23:04
    信息安全的五个基本属性 机密 可用 可控 不可否认 完整性 信息系统安全可以划分以下四个层次:设备安全,数据安全(三要素),内容安全,行为安全 保护、检测、响应(PDR)策略是确保信息系统和网络系统安全的基本策略 ...
  • 信息安全工程师参考资料(一)

    万次阅读 2018-09-04 18:05:50
    第一章 信息安全基础知识 1.1 信息安全研究方向 目前信息安全的研究包括密码学、网络安全、信息系统安全、信息内容安全、信息对抗等方向 网络空间是所有信息系统的集合,网络空间安全的核心是信息安全。网络...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 471,425
精华内容 188,570
关键字:

信息安全软件代理