开发安全流动应用程式
主页 > 
开发安全流动应用程式
< 返回

开发安全流动应用程式

智能手机和平板电脑的增长令公众及机构用户与企业互动的方式产生重大转变。由於现今流动应用程式会用作接达敏感资料和进行重要商业活动,因此亦可能受到不同的威胁。传统上,开发团队专注於应用程式的效能及功能,而保安团队只在所有开发工作完成及推出程式时才参与其中。为开发和维护安全的流动应用程式,在开发流动应用程式的不同阶段须作出各项保安考虑和采取保安措施(包括技术与管理层面)。

开发流动应用程式的保安考虑

保安概念应纳入整个流动应用程式发展周期,以处理保安规定遵行要求,并将保安风险减至最低。软件开发的方法正不断演变,敏捷软件开发或 DevOps (结合「开发」与「操作」)等新的开发模式利用反覆式开发程序达致持续整合和持续交付的目的,以更快速建立流动应用程式。这个方法着重持续的沟通丶整合丶测量和交付,以促进程式开发丶测试及质素保证之间各个程序。

为方便了解在流动应用程式开发过程中的相关保安注意事项,以下会探讨发展周期的一般阶段和主要保安考虑。

要求阶段
Flow direction down
设计阶段
Flow direction down
开发阶段
Flow direction down
测试阶段
Flow direction down
推出前阶段
Flow direction down
维护与支援阶段
Flow direction down
下架阶段

要求阶段

在要求阶段应考虑保安因素,以致保安概念可纳入整个发展周期。应连同功能要求一并订定保安要求,并在软件开发其他阶段进一步加入保安因素。如能妥善订定保安要求,便可於早期阶段解决已确定的风险,大大减少後期阶段的额外工作和补救工作。在订定保安要求时应考虑以下各个方面:

架构丶设计和威胁模型要求
应制定程序,确保在规划流动应用程式的架构和设计时已明确处理保安注意事项。每项组件的功能和保安角色均应清晰界定,并涵盖威胁模型丶安全开发和密码匙管理等项目,例如在推行前采取相关及足够的保安控制措施保护数据和交易。
数据储存和私隐要求
开发者应充分了解所处理数据的类型和敏感度,以及是否涉及关键交易。敏感数据可能无意地披露予同一装置上的其他应用程式,数据亦可能在传递期间外泄。此外,与其他类型装置比较,流动装置较容易遗失或被盗取。开发者应依偱有关私隐的法律和规例(例如《个人资料(私隐)条例》),订定合适的数据储存和私隐要求。如流动应用程式对私隐有重大影响,应进行私隐影响评估。
加密技术的要求
应采用加密技术保护在流动装置储存和处理,或在装置与伺服器之间传输的数据。确保流动应用程式按照业界良好作业模式采用加密技术,包括:
使用经核实的加密库。
正确选择和配置加密原语。
避免重复使用同一组密码匙作多种用途。
使用安全的随机数字产生器产生随机数值。
认证和对话管理要求
应妥善认证和管理用户帐户和对话,包括使用随机产生的接达权标认证客户端的请求丶执行明确的密码政策,以及在发现过多登录尝试时锁定帐户等。应用程式状态变更也应妥善处理,例如在应用程式从後台恢复时需要重新认证。
网络通讯要求
开发者应确保流动应用程式与远程服务端点之间所交换资料的机密性完整性。处理所有应用程式数据时应使用运用已适当设置的传输层保安( TLS )规约的加密频道。在使用 TLS 时,程式必须执行证书确认功能,不应接受任何自签及/或不可信赖的证书。另外,程式亦应可侦测有否使用未获授权证书,以防范网络攻击(例如中间人攻击)。
环境互动要求
应考虑以安全的方式使用平台应用程式界面和标准组件,包括应用程式之间的通讯(程序间的通讯)。
程式码质素和建立设置要求
开发应用程式时应遵从保安编码作业模式,例如程式应以可信赖的证书签署,并应将流动装置的预设接达权限降至最低(例如停用相机/麦克风和预设啓用「不追踪」功能)。
抵御还原工程能力的要求
如流动应用程式会处理或接达敏感资料,应采取保护措施以增强程式抵御还原工程的能力。应考虑采取一系列混淆控制措施,如「应用程式隔离」丶「阻止动态分析和窜改」丶「装置绑定」和「模拟器侦测」等。

设计阶段

设计阶段涉及根据要求阶段所定的规格设计应用程式架构。建立程式架构後,开发团队应参照订定的保安要求,通过识别潜在的遵行要求问题及保安风险审查相关系统设计。这包括为特定类型的数据设计适当的保安控制措施,并结合威胁模型以识别和处理与应用程式有关的风险。

开发阶段

经常留意保安编码标准有助改善保安状况,并减少发生可导致违反保安事件的常见错误。在开发阶段进行保安评估,还有助确定所需的保安控制措施,并适时向开发者提供有关程式码安全的意见。此外,应进行静态源码保安评估( SAST ),及早了解程式码的质素,以便制作统一和优质的流动应用程式。

测试阶段

除用户验收测试外,系统测试丶压力测试丶回归测试和单元测试均对确认系统功能的效能和准确性大有帮助。由於相关平台和测试环境各有不同,与网上应用系统比较,流动应用程式的测试可能更具挑战性。开发者应建立全面的测试计划以设计测试方式,并订定「什麽」丶「何时」及「如何」等测试细节。

按此连结以了解更多关於开发流动应用程式的测试。

推出前阶段

在应用程式推出前和作出重大变更後,应进行保安风险评估和保安审计。每次进行保安漏洞修复时均可能需要更新程式码,因而可能带来新的保安漏洞。因此,必须持续评估相关风险和影响,以确保流动应用程式安全。

维护与支援阶段

应用程式任何新增功能或对现有功能的更新都可能为系统带来变更,因此应制定丶记录丶测试和审查保安措施,确保系统得到妥善保护或免被破坏。持续测试对保障安全十分重要,可保护应用程式免受大部分攻击。应定期审视应用程式,确保有足够的保障。

下架阶段

如应用程式不再符合预定目标或有其他应用程式更能达到预期目的,应考虑将程式下架。下架计划的建议如下:

制定通知方案知会所有相关持份者(例如应用程式用户)
从正式运作环境移除应用程式(例如流动应用程式商店)
保安设计与数据保密

保安设计与数据保密的概念应纳入整个应用程式系统设计及开发程序,以保障数据和个别人士的私隐权。开发者应确保已将保安考虑纳入为基本架构设计的一部分,并应审视因应潜在保安问题而作的详细设计,以及决定和制定应对潜在威胁的缓解措施。在订定私隐要求时,亦应遵从相关法律丶规例和条例(例如《个人资料(私隐)条例》)。在系统设计阶段,开发者应注意以下良好作业模式,以保障用户私隐:

用户通知

知会用户应用程式将收集什麽资料/数据丶有关资料将作什麽用途,以及将如何处理该些资料。
容许用户选择不查阅/使用个人资料。
在用户要求移除应用程式或删除帐户时,让用户可选择删除所有应用程式相关数据及与帐户相关的资料。

数据处理

尽量减少收集个人资料(特别是敏感个人资料),并将流动装置功能(例如相机和位置追踪)的使用权限降至最低。
采用严谨的加密功能和接达控制措施保障用户的个人资料,以免在未获授权的情况下被接达丶外泄或使用。避免将个人辨识资料(例如身分证明文件丶通讯记录)或其他敏感资料储存在用户装置上。
未经用户许可,切勿将敏感资料上载或同步传输至外部系统或装置。
在完成声称的资料用途後,清除敏感数据(例如地理位置数据)。
流动应用程式的常见保安风险

现将关键的流动应用程式保安漏洞列载如下,用户和开发团队应审视和订定其应用程式的保安要求。此外,程式开发者应留意这些常见的保安漏洞,避免其程式码出现同样问题。

1.
不当使用平台
这个潜在威胁源於程式误用平台功能和没有采用平台的保安控制措施(例如 Android 意图丶平台权限丶误用生物识别功能或有关流动作业系统的其他保安控制措施)。误用平台功能可能令系统蒙受风险(如跨网址程式编程)。
2.
数据储存不安全
在开发团队假设用户或恶意软件无法接达流动装置的档案系统及装置的敏感资料时,数据储存不安全的漏洞便会出现。通过流动恶意软件丶经修改的应用程式或取证工具,可能会导致数据损失或程式中的敏感资料遭提取。
3.
通讯不安全
从某一点到另一点的通讯不安全会构成暴露应用程式数据的风险,可能导致敏感资料在网络通讯过程中外泄。有关问题的成因可能是交握式通讯不良丶保密插口层( SSL )版本不正确丶使用不合格的交涉协议及以纯文字格式传输敏感数据资产。
4.
认证不安全
攻击者可能会破解密码丶密码匙或认证权标,以假冒其他用户的身分。有关问题的成因可能是欠缺或没有妥善推行帐户认证机制,以及对话管理不当。
5.
加密不足
攻击者会盗取或接达保护欠佳的数据,这可能是由於没有妥善使用加密功能,为敏感资料资产加密。
6.
授权不安全
攻击者可能会绕过授权机制并执行超越权限的功能。如流动应用程式只依靠客户端授权而没有进行伺服器端授权程序,在伺服器未能正确执行流动应用程式所订定的身分和权限授权时,便可能发生有关问题。
7.
客户端程式码质素
客户端程式码质素欠佳可能产生漏洞(如缓冲区满溢和记忆体外泄),让攻击者可对流动应用程式作出恶意输入。这可能会引致执行外部程式码或远程伺服器拒绝服务( DoS )。
8.
窜改程式码
攻击者可能会以存放於第三方位置的恶意应用程式窜改该流动应用程式,以获取个人或金钱利益。攻击者亦可能通过仿冒诈骗攻击诱骗用户安装应用程式。
9.
还原工程
攻击者可能会分析核心二进制代码,找出其源码丶源码库丶算法和其他资产,从而利用漏洞丶收集敏感数据或盗取知识产权。
10.
外部功能
在开发阶段,开发者可能会建立一些隐藏的後门程式或功能,以便为应用程式除错。如後门程式在推出的版本仍然存在,攻击者便可利用这些後门程式作出恶意行为。
开发安全流动应用程式的注意事项

流动应用程式与其他应用系统一样,有类似的保安考虑和风险,因此一般有关程式开发的良好作业模式亦适用於开发流动应用程式。因应不同的用途丶使用模式和流动平台,流动应用程式开发者亦应留意远端网络服务丶平台整合和流动装置的不安全性。开发者在建立安全的流动应用程式时应考虑以下各个方面:

一般考虑
开发流动应用程序的一般考虑
Flow direction down
系统/软件
认证和对话管理
服务器控制措施
程序代码混淆/逆向工程
使用第三方/开放源码库
数据
数据储存和保护
网上支付
网络管理
通讯保安

一般考虑

处理敏感资料时必须紧记安全及提供充分的保护。
知会用户应用程式将接达和上载什麽资料,以及有关资料将作什麽用途。
如会收集个人资料,应提供收集个人资料声明。
采取「最小权限」原则,以最小的系统权限及接达权限执行应用程式。
按照良好作业模式开发和执行应用程式。
设计和提供方法,让应用程式能进行保安修补程式更新。
如流动应用程式会处理关键/敏感数据,一旦发现已被越狱( jailbreaking )或破解( rooting ),应拒绝执行应用程序或向用户发出警告。
在处理数据前,必须确认所有客户端提供的数据,并检查数据是否在预期类型丶范围和长度的范围内。
在程式处理大量用户数据时知会用户和得到用户的同意。

认证和对话管理

避免只使用装置所提供的识别码(如 UID 或 MAC 地址)识别装置,而应利用应用程式和装置特有的识别码。
采用适当的认证机制,并根据流动应用程式风险评估结果,在处理敏感或财务交易时考虑使用双重认证。
避免储存密码;完成计算密码的杂凑後,应立即清除/删除载有密码的记忆体位置。
充分利用由流动平台所提供的最新保安机制,以保护用户的凭证
在每个活动/画面开始时检查用户是否已在登入状态,否则应切换到需登入状态。
在应用程式的对话超时或用户登出时,清除和删除所有与用户数据有关的记忆体和用作数据解密的主密码匙。

数据储存和保护

只收集和披露程式业务用途所需的数据。
按数据的敏感度对数据储存进行分类和采取相应的控制措施,并根据分类处理丶储存和使用数据。
除非已采取适当的保安措施(例如严谨的加密),否则不应将应用数据储存至外置储存器。
将敏感数据储存或暂存至非易失性记忆体时,使用适当的算法和密码匙长度进行加密,并将流动应用程式所需使用的数据减至最少,以保护数据。
对应用程式可接收数据的相关区域进行输入确认和检查,以防止客户端代码注入或屏幕劫持。
在不再需要敏感数据时,清除和删除记忆体中所有敏感数据。
采用沙盒技术隔离应用程式,通过防止其他应用程式与受保护的应用程式进行互动,提高程式的安全性。

通讯保安

任何敏感数据(例如个人资料或信用卡资料)的传递均应使用端对端加密方法(例如 TLS )以作保护。
如得悉应以保密超文本传输规约( HTTPS )连接,侦测每项请求的连接是否均已使用 HTTPS 。
在使用 TLS 时,程式必须执行证书确认功能,不应接受自签及/或不可信赖的证书。
啓动应用级虚拟私有网络( per-app VPN ),安全地从任何地方和在任何流动装置接达内部网络资源。

伺服器控制措施

评估流动应用程式的後端服务以找出保安漏洞,并确保後端系统执行已强化的配置和安装最新的保安修补程式。
确保後端伺服器已保存足够的记录或资料,以作保安事故侦测及应变和进行调查。
检视应用程式的程式码,以避免在流动应用程式与後端伺服器之间不慎传送数据。

网上支付

就使用应用程式将会涉及的费用向用户发出警告并获取其同意。
如涉及付款资源,应推行保安控制措施(如白名单或重新认证),以防止在未经授权或意外的情况下接达有关资源。
如需进行网上支付,应使用安全的流动支付服务。使用由官方提供的应用程式界面/范本,并严格遵从其执行指引。
知会用户流动装置必须支援的最低技术规格(例如 TLS 支援),以进行支付服务。
在开发设有网上流动支付服务的流动应用程式时遵守特定的数据保安标准(例如 PCI DSS )。

程式码混淆/还原工程

於应用程式啓动时验证应用程式的识别码,以确保程式码没有被更改或破坏。
如程式码没有被编制成机器码格式以防止还原工程,应尽量使用混淆软件,以保护源码和隐藏应用程式资料。
对包含敏感数据的应用程式采用抗除错技术(如防止除错程式附加至程式程序)。

使用第三方/开放源码库

使用可靠及/或官方版本的软件开发工具(例如软件开发套装丶软件库),以避免在不知情的情况下引入木马程式或後门程式。
留意流动应用程式所使用的第三方框架/应用程式界面的最新发布,以安装保安修补程式和进行升级。
应先确认所有经不可信赖的第三方应用程式往来的数据(如广告网络),才在流动应用程式中使用。
开发流动应用程式的测试

由於流动作业系统丶硬件组件和网络环境各有不同,因此在流动装置上测试流动应用程式较在个人电脑上测试网上应用系统更具挑战性。测试流动程式时应考虑以下各个方面:

测试流动应用程式的功能

为了确保流动应用程式能在支援的装置上正常运作,应进行功能测试,以验证应用程式的功能规格。此外,亦需考虑进行不同类型的流动应用程式测试:

1.
兼容性测试:确保应用程式能在支援的装置(如配备 iOS 和 Android 等不同流动平台,以及不同屏幕尺寸和作业系统版本的装置)上正常运作。
2.
效能测试:测量应用程式的效能,如回应速度丶可接受的用户负载和程式稳定性等。
3.
系统测试:确保流动应用程式能找出并处理可能出现的异常情况,并能从意外终止事故中恢复正常运作。

测试程式码质素

开发者在流动应用程式开发过程中会使用不同的编程语言和框架,如没有遵从保安编码作业模式,应用程式可能会出现常见的漏洞(例如弱点插入丶记忆体损毁和跨网址程式编程)。举例来说,插入攻击多数利用流动装置的跨进程通讯( IPC )界面,以恶意应用程式攻击在该装置上运作的另一应用程式。开发者应进行测试,确定可容许不可信赖输入的进入点,或确定使用已知的危险源码库或应用程式界面的地方。

流动应用程式的加密技术

加密技术对於保护用户在流动网络环境中的数据至关重要,因攻击者或可对用户装置作实体接达。开发者应采用妥善的加密方法或合适的密码匙储存应用程式界面储存敏感资料。不要使用任何包含已知漏洞的加密算法或规约。采用良好作业模式和保安配置,确保有关加密算法是最新的,并且符合行业标准。切勿使用过时的加密法(例如 DES )或杂凑函数(例如 SHA1 )。应检查其他配置问题,如密码匙长度不足丶硬编码密码匙和不严谨的密码匙产生函数。

流动应用程式的认证

前端客户及後端伺服器均应整合和进行适当的身分认证,以防止遭受密码字典攻击暴力攻击。一般而言,属非敏感性质的应用程式可考虑以用户名称/密码认证;至於属敏感性质的应用程式,则通常会考虑使用双重认证(例如 SMS 和权标)。应进行测试,确保前端用户及後端伺服器均贯彻执行有关认证程序。

应按以下步骤测试应用程式的认证和授权方法:

确定应用程式使用的附加认证方法。
找出提供关键功能的所有端点。
验证已在所有伺服器端点严格执行该些附加的认证方法。

测试网络通讯

流动装置与伺服器之间的网络通讯通常在不可信赖的网络上进行,因此流动应用程式可能会蒙受网络攻击(如小包探取法或中间人攻击)的风险。在处理敏感数据时,应使用加密连接(例如 HTTPS ),以确保网络数据的机密性和完整性。拦截接受测试的应用程式所接收和传送的网络通讯,并确保通讯已加密,例如利用数据包分析器收集网络通讯,并利用网络规约分析器以人类可读格式显示收集所得的通讯。最後,验证伺服器已按照良好作业模式进行配置。