用于防止和检测安全威胁的方法和系统的制作方法

文档序号:6498642阅读:345来源:国知局
用于防止和检测安全威胁的方法和系统的制作方法
【专利摘要】提供了用于在具有开放开发平台的消费者电子装置上实施平台安全的系统和方法。该装置具有包括在装置硬件和应用软件之间可操作的抽象层的类型。提供用于嵌入在形成操作系统的抽象层内的安全软件代理。安全软件代理被配置为通过阻止可加载核模块加载、阻止对系统调用表进行写入或阻止将调试工具附着到已认证的应用或内核组件的请求来限制对抽象层的访问。
【专利说明】用于防止和检测安全威胁的方法和系统

【技术领域】
[0001] 本公开总体上涉及防止和检测对运行在电子装置上的操作系统和已认证应用的 安全威胁。

【背景技术】
[0002] 诸如移动电话、平板电脑、游戏控制台、机顶盒、电视、个人导航装置和其他消费者 电子装置的装置(或简称为"装置")通常由消费者从零售分发渠道(例如,消费者电子商店) 购买或可通过服务提供商(或简称为"运营商-例如,移动网络运营商、广播电视网络提 供商或因特网视频提供商-被销售给或出租给消费者。传统上,这样的装置是基于专有硬 件和操作系统并且不支持第三方软件应用的封闭的装置或嵌入式装置。然而,这样的装置 已经愈加成为开放的装置。应当理解的是,在本背景讨论的情景中"开放"可以包括不同的 程度,包括但不限于:标准硬件(诸如基于Intel或ARM处理器的芯片上的系统)、开源操作 系统和软件、用以使能第三方应用开发的开放的或公布的API和/或自由可更改的编程。
[0003] 这样的装置可包括开源操作系统,包括诸如Linux (最初由Linus Torvalds在全 世界开发人员的帮助下创建的开源Unix型操作系统)或Android (基于Linux内核的修改 版本且由加利福尼亚州Mountain View市Google公司市场化的开源移动操作系统)的那 些。
[0004] 以未被授权的使用和访问的形式的对封闭或者嵌入式装置的攻击已经发生很多 年了。然而,对嵌入式装置的这样的黑客行为已经是需要硬件和软件技能的专业组合的专 业的且高度技术的过程。相比之下,开放装置具有许多开发人员和计算机黑客很好理解的 硬件和操作系统。因此,开放装置的该趋势大大增大了具有使得这样的开放装置更加易于 受到攻击得多的知识和专长的计算机黑客的潜在数量。这样的开放装置还支持第三方应用 开发人员开发用于那些装置的应用(例如,开放的API的)的能力,并且因此这样的装置还 愈加支持消费者在这样的装置上下载、安装并执行第三方软件应用(或简称为"应用")的能 力。这样的应用不是由装置的运营商或原始设备制造商(或简称为"OEM")开发的。就软件设 计而言,这样的应用可使用在翻译程序或虚拟机内被执行的脚本语言(例如,JavaScript) 或直接在装置上运行的原生代码(例如,C或C++程序)被开发。
[0005] 消费者购买或出租的能力和在装置上下载和安装第三方软件应用的能力可由OEM (例如Apple公司)、运营商或独立于OEM或运营商的公司通常经由基于因特网的零售接口 - 例如,iTunes商店或Android市场(分别由Apple公司和Google公司操作的基于软件的在 线数字媒体商店)来提供。基于因特网的零售接口提供第三方应用开发人员(或简称为"开 发人员")用以与基于因特网的零售接口提供商分享从应用的销售获得的收益的一部分。使 消费者能够在装置上下载和安装这样的第三方应用的趋势也会增大消费者、运营商、开发 人员和OEM的除通常会与嵌入式装置相关联的那些之外的潜在安全问题。
[0006] 被卖给消费者的第三方软件可能包含被称为恶意软件的怀有恶意的软件(例如, 蠕虫、病毒、特洛伊木马、隐藏程式(rootkit)和后门)。这样的恶意软件可导致破坏消费者 隐私一例如,移动电话上的恶意软件可经由移动电话的GPS能力监视用户的位置并将这 样的位置数据传送给远程服务器。恶意软件也可导致装置或相关服务的身份盗用或欺骗性 使用-例如,移动电话上的恶意软件可以自动拨打向用户的移动电话订购添加收费的服 务。恶意软件也可导致针对运营商的网络稳定性问题-例如,移动电话上的恶意软件可以 不当地使用诸如SMS或移动语音调用的网络能力来创建对移动网络运营商网络的拒绝服 务攻击,从而影响网络服务质量或可用性。
[0007] 其他的安全问题包括未被授权的应用。基于因特网的零售接口的提供商可"认证" 应用或应用开发人员以确保在通过他们的基于因特网的零售接口被销售的应用中不存在 恶意软件。这用来提供对恶意软件问题的一定程度的保护并防止应用否则危及装置和/或 装置网络(即,移动网络)的安全。如果该认证过程可以被避免或不是排他的,那么消费者可 能会不知不觉地从未被授权的基于因特网的零售接口或其他因特网网站将恶意软件下载 到他们的装置上。如果该认证过程可以被避免或不足以检测潜在的恶意软件,那么消费者 可能会不知不觉地从基于因特网的零售接口将恶意软件下载到他们的装置上。
[0008] 隐藏程式(rootkit)是通过暗中破坏标准操作系统功能或其他应用使能对计算机 的持续特权访问同时对管理员主动隐藏其存在的一种特定类型的恶意软件。通过rootkit 恶意软件所作的攻击包括若干阶段并使用各种组件:在系统中存在作为利用对象用以利用 其并做出不可预知或并不意图的一些事情的弱点或能力。利用的意图通常是安装可以在 幕后继续运行的诸如附加恶意软件组件的净负荷,从而从远程服务器接收并执行新指令。 典型的净负荷活动包括私人用户信息的秘密上传、发送垃圾邮件或发动分布式拒绝服务 (DDOS)攻击。
[0009] 很多rootkit利用可加载的内核模块来修改运行的操作系统内核以执行净负荷。 可加载的内核模块包含用以在引导时不在存储器中加载所有期望功能的情况下动态扩展 操作系统的运行内核的代码。
[0010] rootkit检测是困难的,这是因为rootkit也许能暗中破坏意图找到它的软件。已 知检测方法包括:使用替代性的可信操作系统;基于行为的方法;签名扫描;差别扫描;以 及存储器转储分析。rootkit的移除可以是复杂的或几乎不可能的,尤其在rootkit驻留于 操作系统内核中的情况下,其中操作系统的重新安装可能是该问题的唯一可用解决方案。 在处理固件rootkit时,移除可能需要硬件替换或专业设备。
[0011] 平台安全的现有方法(即意图解决上面指出的安全问题中的一个或多个的安全措 施)通常涉及在本文中的下面部分被进一步分组和描述的以下方法中的一个或多个。
[0012] "操作系统安全"是操作系统经由其可提供包括过程隔离、访问控制、专用应用编 程接口(API)和应用认证/签名的一个或多个功能或能力以及应用许可服务的安全方法。 这样的功能和能力进一步被描述如下。
[0013] "过程隔离"可被操作系统(或安装在操作系统之下的管理程序(hypervisor))支 持,以确保每个应用和系统的各部分运行在其自己的过程和专用存储器空间中,以使得在 默认情况下没有应用有能力执行会不利地影响另一应用、操作系统(OS)或消费者的任何 操作。每个应用过程可被认为是运行在经常被称为其自己的"沙盒(sandbox)"的其自己的 运行环境中。然而,为了开发对用户有用的应用,多数应用必须能够访问在基本沙盒内不支 持的操作系统服务(例如,在移动电话操作系统上,发送短消息服务(SMS)文本消息,获取 用户位置,记录电话呼叫,拍摄照片,等等)。这限制过程隔离或"沙盒"的效果,因为应用必 须访问沙盒外的操作系统服务,这增大应用可能执行消极地影响其他应用、操作系统或消 费者的操作的可能性。
[0014] "访问控制"涉及解决应用使用沙盒以外的OS服务或资源的需求或原生应用使用 会使得原生应用不利地影响其他应用、消费者或网络的OS服务或资源的需求的能力。这 里,OS包括对是否对请求应用授权这样的访问做出决定的访问控制功能。该访问控制功能 可与许可概念结合起来。例如在来自Google公司的Android OS中,应用开发人员必须在 相关联的清单文件中声明他们的应用所需的许可以使得应用能够执行可能不利地影响其 他应用、OS或消费者的任何操作。访问控制决定也可能依据固有地被授予应用的特权(例 如,Linux OS中的用户应用或根访问)。与许可相关联的问题之一与谁或什么将许可授予 给应用和授予者是否理解这样的批准的含义(例如,在Android OS情况中是消费者授予这 样的许可)的问题有关。另一问题是在许可被消费者或认证机构这样授予之后这样的许可 可能被恶意软件或攻击者修改。一些操作系统有使得能够实施不同的访问控制模型的访问 控制框架(例如,Linux安全模块(LSM))。LSM使得能够将不同的访问控制模型和功能实施 作为可加载的内核模块。
[0015] "专用API"是用以限制应用访问可能不利地影响平台安全的操作系统服务或资源 的另一种机制。这里,虽然很多系统API可能是开放的或公开的,但OEM可通过维持从应用 开发人员访问这样的服务所需的API的保密性来限制对某些操作系统服务的访问。这通常 与应用认证过程耦合,以确保被提交认证的应用不试图调用这样的专用API。
[0016] "应用认证/签名"涉及确保应用不执行恶意操作和/或访问专用API的当前使用 中的各种现有的应用认证过程。这些过程通常包括应用的静态验证(例如,在执行之前扫描 目标代码)(例如,以验证专用API不被应用调用)和动态验证(例如,以验证应用在执行期 间的"稳定性")。如果应用通过认证过程,那么它就以稍后可被验证的形式被认证机构(其 也可能是基于因特网的零售接口提供商)数字地签名。当前的应用认证方案的问题之一在 于,全面的验证不易于自动化并且因此不是排他的。因为这,恶意操作可以被嵌入应用中以 使得它将仅在应用认证/签名过程之后的预先指定时间执行。因此,这样的恶意操作可以 避免在验证过程期间被检测到。应用认证的另一问题是可能必须被基于因特网的零售接口 提供商认证的应用的绝对数量。例如,估计Apple公司的用于提供用于他们的iPhone?品 牌智能电话的移动软件应用的基于因特网的零售接口有超过300, 000个应用并且每星期 有10, 000个新应用被提交给Apple公司。这使得在认证之前执行应用的排他验证变得由 于成本而被禁止。另一个问题是,计算机黑客可以修改或替换针对由基于因特网的零售接 口提供商生成的签名验证应用的完整性所使用的OS中的可信根(S卩,数字证书和软件),以 便应用可以在应用认证/签名之后被修改,使得与该应用相关联的许可可以被修改以允许 敌对的第三方通过消费者将未被授权的或者盗版的应用加载到装置上。
[0017] "应用许可服务"涉及系统借以提供许可服务的防止应用盗版的保护。例如, Android OS提供让应用开发人员为所支付的应用强制执行许可策略的许可服务。然而,这 些类型的应用许可服务可能易于被计算机黑客通过修改应用以提取这样的许可验证检查 来规避。
[0018] 除了在平台安全内找到的每个以上功能和能力中的所指出的问题之外,还存在对 于过程隔离、访问控制和应用许可服务来说常见的问题,由于该问题,支持这样的安全功能 的OS的各部分可以通过修改执行这样的功能的操作系统的各部分而被暗中破坏或绕过。 为了防止对OS安全功能或其他OS功能的这样的改变,经常在装置中实施利用"安全引导加 载器"的另一方法。
[0019] "安全引导加载器"(或简称"安全引导")被用来确保只有预期的引导软件和OS内 核被加载到装置上。这里,认证将适用的软件与由装置OEM生成的签名相比较。引导软件和 OS内核的认证或完整性验证仅在装置启动期间发生,使得这种机制可以被在引导过程期间 发生的动态攻击规避。一旦安全引导加载器被绕过了,OS可以被修改为绕开可能存在于OS 中的其他安全功能。这些动态攻击可以是高度自动化的,使得它们可被消费者访问,否则消 费者没有用以独立地实施这样的攻击的技术技能(即,越狱技术)。此外,一旦安全引导过程 已被危害就无法恢复用于已在实际应用中被部署的装置的装置安全。
[0020] 除了上面指出的与平台安全相关的问题,还存在对于过程隔离、访问控制、应用许 可服务、虚拟机和有关从攻击恢复的能力的安全引导加载器来说常见的问题。通常,一旦发 生了攻击,就没有合适的机制来为已被销售或许可或以其它方式被分发给消费者的装置恢 复平台安全。我们将其称为"静态安全",这是因为这样的平台安全的设计中的固有的假设 是:被落实到位的平台安全机制在装置的有用寿命期间将抵抗任何和所有攻击。静态安全 经常被攻击并且这样的攻击然后被"打包"成可以被普通消费者实施的自动攻击(例如,对 由Apple?所开发的iPhone?的已知越狱攻击)。
[0021] "病毒检测和入侵防护软件"是被用来检测恶意软件并减轻这样的恶意软件可能 导致的任何损害的另一种安全方法。迄今,用以检测诸如移动电话的装置上的恶意软件的 几乎每个解决方案依赖于个人计算机(PC)防毒解决方案已使用数年的相同的基于"签名" 的机制。术语"签名"在这里不涉及数字签名,而是通过其可识别特定恶意软件的一组属性 -例如,诸如具有特定长度以及在其内的某个位置具有特定的字节序列的属性。然而,这些 签名仅被理解为,一旦恶意软件被部署了,就意味着恶意软件可能已造成了损害。此外,这 些基于签名的类型的解决方案必须不断被更新并且必须能够检测数万计的恶意软件签名。 这些不能单独作为检测并防止来自装置上的恶意软件的损害的唯一手段被依赖。此外,防 毒软件本身可以被恶意软件修改或禁用以防止这样的检测。
[0022] "虚拟机"是被用来应用平台安全的又一安全方法。诸如Java?虚拟机(JVM)的虚 拟机被设计为允许从可能不可信的源获得的应用的安全执行。JVM接受通常被称为Java? 字节码的计算机中间语言的形式,Java?字节码在概念上是表示来自加利福尼亚州红杉树 市的Oracle公司的面向堆栈的能力架构的指令集的编程语言。Java?应用运行在被设计为 保护用户免遭作弊代码或恶意软件的限制沙盒中。这伴随着性能限制和功能方面的限制- 例如,应用被禁止访问被认为"危险"的操作系统功能和资源。
[0023] 每个上述安全方法形成如现有技术图1中所示的静态平台安全功能100的一部 分。此外,如图1中所示的安全自举加载110例如在2001年2月6日被授予Arbaugh等的 美国专利No. 6, 185, 678中是被熟知的,并且在本文中没有进一步描述。
[0024] 因此,期望提供克服与防止装置和该装置上的数字资产的未授权使用的以前的方 法以及静态平台安全的限制相关联的问题中的一些的安全机制。


【发明内容】

[0025] 根据第一方面,提供用于安全威胁的防止和检测的系统和相关方法,其包括:装置 硬件,所示装置硬件包括至少一个CPU和存储器;抽象层,其被存储在所述存储器中,可工 作在所述装置硬件和应用软件之间;以及嵌入所述抽象层的安全软件代理,所述安全软件 代理被配置为限制对所述抽象层的访问。在一些方面中,所述抽象层是诸如Linux的开放 的操作系统,并且在一些方面中,所述安全软件代理符合Linux安全模块。
[0026] 根据相关方面,所述安全软件代理被配置为防止加载被用来扩展所述抽象层的功 能的软件代码。在一些方面中,该软件代码是可加载内核模块。在另一方面中,所述安全软 件代理被配置为验证所述可加载内核模块,并且防止加载所述可加载内核模块是基于成功 的验证的。在一些方面中,所述验证基于存储在被所述代理访问的安全存储器中的所述可 加载内核模块特有的信息。在一些方面中,所述安全软件代理可以被并入加载可加载内核 模块的内核工具中,在一些其他方面中,所述内核工具包括基于Unix的内核工具加载模块 (insmod)。
[0027] 根据另一相关方面,所述安全软件代理被配置为阻止写覆盖指向对所述抽象层的 系统调用的指针。在一些方面中,所述安全软件代理阻止对包含指向系统调用的指针的系 统调用表进行写入。在一些方面中,所述安全软件代理阻止对包含所述系统调用表的存储 器范围进行写入。
[0028] 根据又一相关方面,所述安全软件代理被配置为阻止调试工具请求。在一些方面 中,所述安全软件代理被配置为确定调试工具请求是否尝试附着到已认证应用和所述抽象 层的组件中的任一个,并且所述安全软件代理阻止所述调试工具请求是基于所述确定的。 在一些方面中,所述调试工具包括对所述抽象层的过程追踪系统调用。在另一方面中,所述 调试工具是进程跟踪(ptrace)或Android调试桥后台程序。
[0029] 在审阅结合附图进行的对特定实施例的以下描述后,其它方面和特征对于本领域 普通技术人员来说将变得清楚。

【专利附图】

【附图说明】
[0030] 为了更好地理解本文中所述的各种实施例并更清楚地示出可以如何实现它们, 现在将仅通过示例方式对示出至少一个示例性实施例的附图进行参考,并且在附图中: 图1是表示现有技术的静态平台安全功能的示意图。
[0031] 图2A是示出如被应用到Android OS的实施例的层示意图。
[0032] 图2B是示出如被应用到Android OS的另一实施例的层示意图。
[0033] 图2C是示出如被应用到Android OS的又一实施例的层示意图。
[0034] 图3是示出根据图2A的实施例的动态平台安全功能的某些方面的示意图。
[0035] 图4是示出根据图3的实施例的典型引导加载序列的示意图。
[0036] 图5是示出根据图3的实施例的供应序列的示意图。
[0037] 图6是示出根据图3的实施例的应用许可的安装的示意图。
[0038] 图7是示出根据图3的实施例的运行时期间的连续系统完整性的示意图。
[0039] 图8是示出根据图3的实施例的运行时期间的用户应用请求的验证的示意图。
[0040] 图9是示出根据图3的实施例的运行时期间的应用许可强制执行的示意图。
[0041] 图10是示出根据图3的实施例的可加载内核模块强制执行过程的示意图。
[0042] 图11是示出根据图3的实施例的系统调用表保护过程的示意图。
[0043] 图12是示出根据图3的实施例的调试阻止过程的示意图。

【具体实施方式】
[0044] 虽然适用于任何移动电话、游戏控制台、平板电脑、机顶盒、电视或其他消费者电 子装置,但是本文中所述的实施例将根据使用诸如但不限于Linux或Android ? OS的开放 OS的这样的装置。尤其地,仅仅出于说明的目的,优选实施例将关于Android? OS被示出 和描述并且不应被解释为限制本公开的预期范围。实际上,在防止rootkit的安装或防止 探查OS的弱点方面描述的一些优势普遍适用于任何装置0S,其中由于与这样的开放装置 相关联的固有地更大的安全风险而对任何开放的装置具有特别的用处。
[0045] 参考图2A-C,示出分层执行堆栈的基本结构的Android TM OS环境的总体层示意 图200。基础层219涉及典型的片上系统(SOC)组件,包括中央处理单元(CPU)、图形处理 单元(GPU)、和基本输入/输出系统(BIOS )驻留在其中的存储器(只读存储器(ROM))。 图2A-C中示出的最上层是在这里被示出为一个或多个Android?应用210a、210b的装置应 用。中间层包括各种已知的软件和硬件元件,包括硬盘驱动器(HDD)存储装置或闪存220、 OS内核215和管理OS原生应用223和Android? OS 213之间的系统调用的OS内核应用接 口层214。根据所示的实施例,分层执行堆栈还包括Android? OS 213和虚拟机(VM )层 211 (即,Dalvik,其是形成Android ? OS的整体的一部分的Android ? VM)之间的Java ? 访问控制(JAC)层212。VM层用于将给定应用转换成适于在给定装置上以已知方式执行的 压缩可执行形式(即,就Android ?应用而言的〃.dex〃格式)。JAC层212用于通过认证安全 代理(或简称为"代理")217和VM层211的机器可执行代码之间的通信来提供安全访问控 制。这样的访问控制功能可包括提供脚本应用与原生代理之间的桥梁以允许代理验证脚本 应用的完整性从而将"应用"的范围扩展到脚本应用的任何合适的已知机制。进一步应当 理解的是,如果所有应用都被假定为是原生应用224,那么将不需要JAC层212。
[0046] 应当理解的是,一些实施例可以结合如图1中所示的已知静态平台安全功能100 而被实施。更具体地说,一些实施例可以通过确保执行这样的功能的操作系统的各部分在 运行时期间或在引导过程期间不被修改而包括诸如过程隔离的现有OS系统安全功能。另 夕卜,实施例通过验证遵循了正确的安全引导加载器路径并通过动态验证OS和引导加载器 的完整性来补充现有的安全引导加载器功能(如图2A-C所示的第1阶段引导加载器221和 第2阶段引导加载器222)。应当理解的是,这样的安全引导加载器仅在启动期间起到如此 作用。
[0047] 代理217被嵌入OS内核215中,并且优选地被实施为使用Linux安全模块接口 (LSM 1/F)。代理217在其中来自应用的用户级系统调用即将导致对诸如索引节点和任务 控制块的重要内部内核对象的访问的内核中的点处插入"钩"(上调用代理217)。在本文 中不对LSM进一步讨论,因为它是允许Linux内核支持各种计算机安全模型而不偏爱任 何单个的安全实施方案的已知框架(其适用于Android?以及Linux分布)。为了使得代理 217抵抗篡改、更改和反向工程攻击,代理217使用已知软件保护技术保护其自身,已知软 件保护技术诸如但不限于在每个均被授予Chow等人的美国专利号6, 594, 761、6, 779, 114、 6, 842, 862和7, 506, 177中被更详细地描述的那些,上述专利示出可结合所公开的实施例 使用的这样的抗篡改性的示例。
[0048] 应当理解的是,代理217形成OS内核215的完整的且不可拆分的一部分,没有其 的情况下,装置OS 213和/或应用210a、210b、224将停止正确地起作用。代理217的功 能的一个示例是监视OS 213和被加载到装置上的应用210a、210b、224的完整性并检测OS 213或者安全引导221、222的任何破坏。代理217维持并具有对安全数据存储器218的唯 一访问权限,代理217将关于应用资源访问控制、应用许可、完整性验证、内核资源访问控 制的代理性能的信息保持在安全数据存储器218内。虽然安全存储器218在图2A中被示 出为是本发明的系统的单独的组件,但应当理解的是,安全存储器218可存在于硬盘驱动 器或闪存220中,如在图2B的替换实施例201中所看到的那样。另外,安全存储器218可 作为芯片基础层219上的系统内的安全存储器存在,如在图2C中的另一替换实施例202中 所看到的那样。
[0049] 就内核资源访问控制而言,代理被配置为控制对OS内核资源和数据的应用访问。 由代理217做出的访问控制决定是基于但不限于诸如以下的因素:OS内核完整性、应用完 整性、应用情景以及由任何给定可信根机构授予的特权。根据OS内核完整性的访问控制决 定确定内核是否已被修改、替换、增加或以未授权的方式被部分移除。访问控制决定还将确 定安全引导过程甚至是否发生。如果OS内核被修改、替换、增加或被部分移除或者安全引 导过程无法被肯定地验证,该确定会起到使代理217或应用224或诸如媒体播放器的安全 应用赖以正常运行的很多假设无效的作用。基于应用完整性的访问控制决定确定尝试访问 OS内核资源的应用是否以任何方式(例如,将恶意软件插入应用中或通过其他恶意软件)被 修改了或者与该应用相关联的特权是否已被修改(例如,给予其访问没有被认证机构授权 的系统资源的特权)。
[0050] 基于应用情景的访问控制决定确定给定应用是否正以该应用的情景以外的某些 方式在起作用。因此,代理217可以做出情景敏感访问控制决定。基于任何给定可信根机 构的访问控制决定确定与该机构有关的应用许可。换而言之,一些实施例可能支持多个应 用签发机构,使得代理217可就对系统资源的访问而言向由高度可信的机构签发的应用授 予与可被授予由较不可信的机构签发的应用或完全未被认证的应用的自由度相比更大的 自由度。
[0051] 就代理的完整性验证性能而言,代理被配置为动态监视(例如,当软件正在运行时 在存储器中)内核、安全引导组件、代理本身和所有受保护的应用和未被保护的应用的完整 性,以确定这些项中的任何一个是否已在给定应用的执行期间在任何时间以任何方式被修 改了(例如,可能使用调试程序被实施的动态篡改)。
[0052] 就代理的应用资源控制性能而言,代理217被配置为控制对应用资源的访问,所 述应用资源可以包括例如已被代理217加密的应用的一部分或应用执行所需的数据文件 (例如,游戏资源文件)或用以控制应用的执行的数据。这样的访问控制决定是基于诸如但 不限于如下的因素:有效许可数据的存在或者对装置或消费者的身份的确认,两者中的任 一个均被设计为保护应用免遭盗版。
[0053] 代理217可以被体现为软件并由具有固定接口的多样代码部分组合生成。代码部 分中的这样的变化的产生可以根据已知的方法或这样的方法的组合来完成,所述方法包括 在每个均被授予Chow等人的美国专利号6, 594, 761、6, 779, 114、6, 842, 862或7, 506, 177 中被描述的那些或任何其它合适的已知方法。这样的变化可以被称为"多样代理"或"更新 代理。"多样代理是具有相同的功能F、但在结构上和语义上不同的那些。生成和部署多样 代理的目标是防止自动攻击-即,可被充分自动化以使得其容易被普通消费者使用且会 适用于每个和每一个部署在装置的某已安装基础中的代理的由老练的攻击者所开发的攻 击。这样的多样代理可跨不同实体化的装置、不同类型的装置、在不同地理地区售出的装置 或通过不同运营商售出的装置等等被部署。
[0054] 更新代理是如下这样的代理:凭借该代理,如果具有功能集Fl的代理Al被部署 在域中并以某种方式被危害或攻击,那么可期望修复这样的弱点。这可以通过生成包含功 能Fl但还包含被设计用以防止对Al的攻击的新功能的代理A2来完成。该增加的功能F2 使得A2的功能现在是Fl + F2。通过将多样性能力应用到A2,对于攻击者来说更加难以在 实施新功能F2的A2中隔离软件功能(例如,通过差异分析)。更新代理提供用以解决对装 置或已被部署在域中的代理的攻击的机制。这样的更新代理可以被消费者下载,通过软件 更新机制被推送至装置,或通过现有代理被拉到装置。在这样的更新发生的情况下,应当理 解的是,它们是通过在识别和分析由安全威胁所进行的任何尝试的或者实际成功的攻击后 将代理软件配置用于更新来完成的。因此,可以针对"开发中的"攻击发布对代理217的更 新,因为计算机黑客会经常发布开发中的攻击或已知弱点的信息,但是其尚未成功达到攻 击者目标。
[0055] 关于图3,示出了根据图2中示出的一般化堆栈架构的动态平台安全功能的更详 细的示意图300。这里,在与现有技术的图1比较时,可以清楚地看到所示出的实施例如何 补充并可以结合已知的静态平台安全功能被实施。如在以前的图2A-2C中一样,基础层包 括典型的SOC 329组件,其包括CPU 330和BIOS 331驻留在其中的ROM 333。
[0056] 就图3中所示出的操作而言,存在如所示出的那样被提供的典型的安全引导加载 器序列310。应当理解的是,一些实施例可以利用现有的安全引导技术。还应当同样被理 解的是,引导序列可被同样地应用到第1阶段或之后的许多阶段。通常,在如图3所示的系 统中有2个引导加载阶段334、335。一般而言,发生安全引导组件的自下而上的验证,因为 第一组件在将执行控制转移到下一组件之前验证第二个组件。该引导时间完整性验证通过 虚线的方式被示出。这里,第一阶段发生在装置复位之后,其中ROM代码被硬连线到装置复 位地址。在验证下一引导阶段是预期的引导阶段后,ROM (或引导R0M)333加载下一引导阶 段334。该验证或认证是通过计算来自HDD或闪存328的数字签名来执行的。如果数字签 名匹配预先计算出的值(如所示的那样被封装在数字证书332中),那么OS引导加载器335 将被加载到主存储器中并被执行。如果签名在任何阶段都不匹配预先计算出的值,则执行 控制将不会转到下一阶段并且装置将无法引导。当OS引导加载器335具有执行控制时,OS 引导加载器335执行验证来自HDD或闪存328的OS镜像的类似操作。同样,如果计算出的 签名匹配预期的预先计算出的签名,则它将加载到OS镜像的存储器中并且将控制转到OS 镜像(即,如所示的在Android? OS 339中运行的Linux内核325)。OS镜像然后将初始化, 并且在这个过程期间代理336也将被初始化。虽然代理336被包括在被数字地签名的OS 镜像内,但应当理解的是,代理336可被更新。这是因为,签名被分解成逻辑模块分离并且 每个模块具有在安全引导过程期间被检查的其自己的签名。因此,任何模块可被替换,尽管 签名必须是有效的且在具有数字签名私钥的情况下是密码可信的。
[0057] 继续参考图3,0S内核325被示出为被修改用于Android? OS 339的Linux内核。 可使用Linux安全模块("LSM")来实施OS内核325。如上面被提及的,LSM是允许Linux内 核325支持各种计算机安全模型同时避免偏爱任何单个的安全实施的框架。LSM在Linux内 核325中的其中用户级系统调用即将导致对重要内部内核对象的访问每点处提供钩。LSM 可被用于实施广泛的安全功能(例如,强制访问控制(MAC)、按访问病毒检查)。
[0058] 代理336也可被配置为包括完整性验证(或简称为" IV")。被嵌入代理336中的 IV功能使得代理336能够执行静态完整性验证(例如,对HDD或对闪存)和动态完整性验证 (例如,在随机存取存储器(RAM)中)。通过计算用于应用或系统组件的哈希值并且然后将其 与哈希函数的已知好值相比较来实施IV。如果计算出的值与所存储的已知好值相同,那么 代理假设该组件没有被攻击者修改过。然而,如果计算出的值不同于所存储的已知好值,则 代理假设该组件已被修改并且不能再被信任用以执行打算要它执行的功能或者它不应该 再具有最初指派给它的相同的特权。
[0059] 如图3中所示的,代理336在进行中的基础上对多个装置软件组件执行IV检查。 进行该"完整性监视"是为了检测任何未被授权的更改(例如,篡改),诸如对支持系统的安 全目标来说至关重要的组件或子组件的更改、替代、移除或增加。
[0060] 由代理336经由IV所监视的这样的组件可包括:R0M BIOS 331 ;HDD或装置闪存 328 ;第1阶段引导加载器334 ;第2阶段引导加载器335 ;Linux内核325或Linux内核的 部分;系统调用接口(1/F) 338 ;包括安全存储器327的代理336(在引导时间和运行时两者 期间,如分别通过图3中的虚线箭头和实线箭头所指示的那样);原生应用320 ;Android? OS 339 ;原生 Android?应用 321 JAC 324 ;Android?(Dalvik)虚拟机 323 ;Android?应用 322 ;以及应用和系统供应序列(如下面针对图4和5进一步描述的)。
[0061] 对原生应用1 320的这样的完整性监视(通过实线箭头示出)在图3中被示出。 这里,代理336连续地监视原生应用1 320,使得在原生应用1 320尝试通过系统调用1/F 338访问系统资源时完整性被验证。这通过签名验证337而发生,由此,代理336通过将 签名1 340与对应于应用1资源的已知好值相比较来实施IV。具体地,应用1资源包括IV 信息和存储在安全存储器327中的应用签名证书。如果签名1值与所存储的应用签名证书 (即,已知好值)相同,那么代理336假设原生应用1 320没有被攻击者修改过并且其许可或 特权341没有被修改过。然而,如果签名1值不同于已知好值,那么代理336假设原生应用 1 320已被修改了并且不能再被信任用以执行打算要它执行的功能。这个过程针对可能存 在的直到原生应用n 321的所有原生应用而发生。
[0062] 将针对其中示出有运行时引导加载序列400的图4进一步解释图3中示出的过程 隔离块326。尤其地,在装置复位后,可以看到对安全引导组件的自上而下的验证(在步骤 1、2和3)。该验证用于确保被加载到装置上的OS是OEM或运营商所预期的那个并且该OS 具有预期的功能。一旦代理336在初始化期间获得执行控制(在步骤4),代理336就将对其 自身以及包括引导ROM镜像、OS引导加载器以及OS镜像的安全引导加载器的以前被执行 的组件执行IV。如果由代理336通过使用与驻留在代理安全存储器327中的数据的比较 (在步骤5至8)确认了所有这些组件的完整性(从步骤1至步骤4),那么代理336假设安 装在装置上的OS是预期OS并且可被OS执行的某些安全功能没有被修改过。然而,如果代 理336确定所述组件中的一个或多个未能被认证,则代理336可采取更正动作。
[0063] 代理336采取的可能更正动作是:将引导组件替换为预期引导组件的备份镜像, 然后复位装置并再次开始启动过程。如果代理336在多次尝试更正无效的组件之后检测到 系统是无效的,那么代理336可以否决对重要系统资源或应用资源的所有进一步的访问。 应当容易清楚的是,尝试的次数是使用预定变量的设计选择问题。同样,对哪些资源可被认 为是重要的确定可以基于给定装置用途被预先确定。代理336也可以实施其它更正动作。 [0064] 应当理解的是,之前的详细描述假定应用已存在并且因此是OEM、运营商、基于因 特网的零售接口提供商所已知的并且继而是代理336所已知的。然而,容易清楚的是,新的 应用可被开发并且旧的应用可被更新。因此,图5示出应用认证过程500期间的被应用到 由开发者提交的应用(未被保护的)的处理。代理可以包括资产保护工具514,其可以被实 施作为被配置为创建和更新加密的应用安全存储器512的软件工具。资产保护工具514存 储用以保护未被保护的应用的信息。应当理解的是,各种反篡改技术可以被应用到所存储 的信息,诸如但不限于安全加载器和IV,以及用以保护休眠中的(例如,磁盘上的)和使用 中的(例如,存储器中的)密码秘密的白盒密码的使用。
[0065] 进一步关于图5,在步骤1提供了未被保护的资产515 (S卩,来自开发人员的新应 用)。在步骤2,未签名的增强许可容器清单510被应用开发人员或开发系统创建。其列出 由认证机构授予应用的许可(A,B,...等等)。此外,许可被映射到内核系统调用的特定 集合。在创建未签名清单510之后,在步骤3资产保护工具514被配置为生成或使用所提 供的专用可信根密钥511。该可信根可由资产保护工具自动地且随机地生成。资产保护工 具514然后在步骤4经由资产保护工具514对未签名的应用515进行签名并将结果放入存 在于应用安全存储器512内的已签名的增强许可容器清单中。此外,在步骤5将增强许可 容器清单的已签名版本存储在其中放置有专用于给定资产的信息(例如,代码签名、增强许 可容器清单、可信根密钥)的应用安全存储器512中。步骤6处的所产生的结果是全供应的 应用的形式的已签名的且受保护的资产513。可选地,未被保护的新应用可具有包裹其的安 全加载器,以便提供具有静态篡改抵抗性且被IV使能的结果得到的受保护资产。
[0066] 还应当理解的是,不是所有应用类型都可被供应用于上面所讨论的资产保护工 具的任何特定实施例。例如,在具体涉及Android? OS的实施例中,可被供应、安装并且 随后运行在实施本实施例的系统上的典型应用类型列表可被限制为原生OS应用、原生 Android ?应用和Android ?应用。除在此被说明的特定Android ? OS实施之外,其他开放 的OS实施当然可以是可能的。
[0067] 在图5的供应序列中创建的许可信息在到装置上的安装期间以及给定应用的运 行时期间进一步被代理336使用。此外,当选自可用应用类型的给定应用代码被供应时,应 用安全存储器中的结果得到的已签名增强许可容器清单包含应用代码在运行时期间需要 的所有许可。增强许可容器清单可以指定应用代码签名和容器本身的签名,以防止容器或 应用在应用代码已被签名之后被篡改。
[0068] 关于图6,示出了应用许可的初始安装600。已签名增强许可容器清单611在图5 中在供应时间期间被创建的应用安全存储器610内被找到。正如以前提到的,增强许可容 器清单611被资产保护工具514加密。因此,这促进增强许可容器清单611从应用安全存 储器610到代理安全存储器612的转移。应用安全存储器610和代理安全存储器612两者 都包括如大体示出在图3中的安全存储器。
[0069] 在增强许可容器清单内611内,存在许可列表(S卩,许可A,许可B,...等等)。许 可列表确定什么OS内核资源可以被形成正被安装和运行的应用的给定应用代码访问。应 用代码签名被代理613用来对应用执行IV,以确保当它针对特定内核许可做出诸如"安装" 请求的OS请求时它没有被修改过。容器签名是用于容器本身的参考值,并且被代理613用 来确保容器的内容没有改变过。一旦OS和应用的完整性被验证了,被安装的应用的增强许 可容器清单就将被存储在代理安全存储器612中,以用作该应用的其他许可请求的将来参 考。
[0070] 进一步关于图6,安装序列包括在步骤1首先依照来自应用代码615的安装器指 令向OS内核614发送安装应用的请求。随后,OS内核614在步骤2将该请求传递给代理 613。代理613在步骤3验证(如上面已经描述的那样通过IV)0S内核614。如先前在上面 指出的,应当理解的是,代理613也以进行中的方式(S卩,作为后台过程)验证OS内核614。 在步骤4,代理613访问应用安全存储器610以从其获取已签名增强许可容器清单611。代 理613在步骤5使用已签名增强许可容器清单611通过IV验证应用的已签名增强许可容器 清单。代理613在步骤6将被验证的应用的增强许可容器清单存储到代理安全存储器612 中以供将来参考。基于步骤5的验证操作,在步骤7代理613允许或否决到OS内核614的 安装。继而,OS内核614在步骤8将许可(允许或否决)传递给正在安装待安装的应用的安 装器指令,以最终允许或否决应用代码615的安装。
[0071] 如上面被提及的,代理以进行中的方式在需要内核操作时验证OS内核。该内核访 问控制700就连续的运行时系统完整性方面在图7中被示出。无论任何应用何时针对内核 服务做出OS请求都如何维持整个系统完整性的序列。在图7中,被安装的且正运行的应用 (即,用户应用)710被示出为正在为OS服务或资源711做出请求。该请求被传递给OS内核 712并且该请求继而经由将最终允许或否决该请求的LSM功能被传递给代理713。被代理 713使用以允许或否决应用请求的标准可以包括:系统/应用完整性、应用许可、应用行为、 用于可能正在运行的其他应用的安全情景、以及远程命令(元件216,在前面关于图2A被示 出)。
[0072] 与系统/应用完整性相关的代理决定标准包括是否检测到对系统或者应用组件 的篡改。
[0073] 与应用许可相关的代理决定标准包括应用是否具有用以做出这样的请求的必要 许可。在Android? OS中,这样的许可在与应用相关联的清单文件中被声明。应用开发人 员必须声明这些许可并且由消费者决定是授予还是不授予可能是有问题的(因为消费者通 常不知道他们的动作的安全含义)这些许可。
[0074] 与应用的行为相关的代理决定标准忽视应用是否可以具有访问某些内核服务的 许可并且相反依赖于应用的行为。例如,每隔15秒请求消费者GPS坐标并且然后尝试通过 诸如SMS的某些消息传递协议将这样的坐标发送给第三方的应用很可能是"间谍软件"。这 样的行为因此可能导致请求否决,即使应用可能具有与关于GPS坐标的内核服务相关联的 许可也是这样(即,如果应用具有被授予位置数据的权限、但是不具有被授予SMS数据的权 限,则代理会阻止访问)。
[0075] 与可能正在运行的任何其它应用的安全情景有关的代理决定标准也忽视应用是 否可能具有访问某些内核服务的许可,并且相反查看当另一可信应用正在运行时允许请求 是否会消极地影响这些可信应用中的一个或多个。换而言之,代理在运行时适当地强制执 行许可。例如,进行请求的应用可能在实施数字权利管理的可信高分辨率视频播放器应用 已加密高分辨率视频之后尝试访问某些存储器或驱动器以捕获该视频,由此对该进行请求 的应用对该高分辨率视频数据的使用的合适性产生疑问(即代理可能阻止对屏幕缓冲存储 器的访问,虽然允许视频本身的播放)。
[0076] 与远程命令相关的代理决定标准涉及向代理提供支持可覆盖应用许可或特权的 来自远程实体(例如,服务提供商)的命令的能力。例如,移动运营商可能希望禁用被偷了的 移动装置。在此情况下,代理也会使提供系统访问的决定基于会防止装置被装置的未被授 权用户使用的远程命令。例如,移动运营商可能希望禁用或限制一个或多个应用对网络服 务或其他内核资源的访问,如果这样的应用正在导致网络可靠性或稳定性的问题(例如,通 过产生网络不能承受的大量流量或连接)的话。在此情况下,代理会覆盖应用具有的特权或 根本防止应用执行。
[0077] 此外,这样的来自远程命令控制器的命令可被用来限制许可(例如,减少特权、改 变特权或撤销特权)。此外,这样的来自远程命令控制器的命令可被用来从装置移除应用, 包括终止应用(如果当前正在执行的话)、从存储器移除应用或完全卸载应用。总的来说,重 要的是注意,所描述的实施例可能不仅用来"杀死"应用,还可能用来限制对系统资源的访 问(除了被隐含在与给定应用相关联的特权中的访问之外)_例如,即使应用有特权发送 SMS消息,这也不被量化在特权中,以使得在应用例如1小时发送10, 000条SMS消息时,代 理可以根据存储在代理安全存储器中的某"正常行为"模板或根据远程命令"减缓该向后"。 另外,代理可被用来将异常行为报告回远程实体,以便,例如,移动运营商或指定第三方可 以对要做什么做出决定(例如,应用已经在一定时间段期间针对系统资源做出了 X次请求)。
[0078] 使用上面提到的标准用于正在进行的运行时系统完整性,在图7中示出的内核访 问控制700包括由用户应用710在步骤1做出的初始OS请求。继而,应用在步骤2创建软 件中断或者以其它方式为OS创建事件。在OS内核712中,LSM在步骤3收到请求711(即, 中断/事件)并向代理713传递该请求711。在步骤4代理713使用如上所述的标准完整 性验证应用710以及许可。在步骤5,代理713验证用户请求存储器堆栈。之后,在步骤6 代理713完整性验证存储器中的OS内核镜像。正如以前提到的,IV检查由代理713在进 行中的基础上运行。该检查验证IV过程仍在运行并且没有检测到篡改的任何证据。基于 该系统验证过程(步骤4、5和6),代理713因此允许或否决请求,并且在步骤7,将对请求的 允许或否决传递给OS内核712。继而,在步骤8 OS内核712将对请求的允许或否决传递下 去。在此时,在具有允许或否决请求的决定的情况下在步骤9应用事件将控制返回至应用 710。
[0079] 如图7的连续的运行时系统完整性中,应当理解的是,应用也可以以进行中的方 式被验证。因此,在图8中示出了对应用请求的运行时验证。通常,应用必须未以任何方式 被篡改,否则这里的验证将失败。图8中的堆栈图800示出一些实施例如何可以有效地提供 应用完整性监视同时维持系统完整性。示出了用于代理812、OS内核811和应用810的地 址空间。当代理被嵌入OS内核中时,应当理解的是,代理地址空间812因此与OS内核地址 空间811共享。调用堆栈中的返回地址是到被包含在代理中的完整性验证信息的数据点。 应用的运行时验证(在步骤1)的开始涉及代理针对OS服务走过请求的堆栈同时验证所有 返回地址(在步骤2至4)并且利用调用堆栈签名对地址范围执行完整性验证,如下面所述 的那样。当应用针对任何OS内核服务做出请求时,OS内核将内核服务的该请求传递给代 理。该OS内核是LSM使能的,使得代理被要求允许或否决该请求。
[0080] 运行时调用堆栈签名计算可以使用堆栈上的每个返回地址到堆栈顶部之间的距 离(以字节为单位)来完成。表A代表用于代理812、0S内核811以及应用810的示例调用 堆栈。

【权利要求】
1. 一种用于防止安全威胁的系统,所述系统包括: 装置硬件,其包括至少一个CPU和存储器; 抽象层,其被存储在所述存储器中,所述抽象层可工作在所述装置硬件和应用软件之 间;以及 嵌入所述抽象层的安全软件代理,所述安全软件代理被配置为限制对所述抽象层的访 问。
2. 根据权利要求1所述的系统,其中所述抽象层是开放的操作系统。
3. 根据权利要求2所述的系统,其中所述开放的操作系统包括Linux内核。
4. 根据权利要求3所述的系统,其中所述安全软件代理符合Linux安全模块。
5. 根据权利要求1-4中任一项所述的系统,其中所述安全软件代理被配置为防止加 载用以扩展所述抽象层的功能的软件代码。
6. 根据权利要求5所述的系统,其中所述软件代码是可加载内核模块。
7. 根据权利要求6所述的系统,其中所述安全软件代理被进一步配置为验证所述可 加载内核模块,并且防止加载所述可加载内核模块是基于所述验证的。
8. 根据权利要求7所述的系统,其中所述安全软件代理基于存储在安全存储器中的 所述可加载内核模块特有的安全信息验证所述可加载内核模块。
9. 根据权利要求5-8中任一项所述的系统,其中所述安全软件代理的一部分被并入 用于加载用以扩展所述抽象层的功能的软件代码的内核工具中。
10. 根据权利要求9所述的系统,其中所述内核工具是加载模块。
11. 根据权利要求1-4中任一项所述的系统,其中所述安全软件代理被配置为阻止写 覆盖指向对所述抽象层的系统调用的至少一个指针。
12. 根据权利要求1-4中任一项所述的系统,其中所述安全软件代理被配置为阻止对 具有指向系统调用的至少一个指针的系统调用表进行写入。
13. 根据权利要求11和12中任一项所述的系统,其中所述安全软件代理阻止对包含 所述系统调用表的存储器范围进行写入。
14. 根据权利要求1-4中任一项所述的系统,其中所述安全软件代理被配置为阻止调 试工具请求。
15. 根据权利要求14所述的系统,其中所述安全软件代理被配置为确定调试工具请 求是否尝试附着到已认证应用和所述抽象层的组件中的任一个,并且所述安全软件代理基 于所述确定而阻止所述调试工具请求。
16. 根据权利要求14和15中任一项所述的系统,其中所述调试工具包括对所述抽象 层的过程追踪系统调用。
17. 根据权利要求14-16中任一项所述的系统,其中所述调试工具是进程跟踪和ADBd 中的任一个。
18. -种防止装置上的安全威胁的方法,所述装置具有可工作在装置硬件和应用软件 之间的抽象层,所述方法包括: 将安全软件代理嵌入所述抽象层中;以及 通过所述安全软件代理限制对所述抽象层的访问。
19. 根据权利要求18所述的方法,其中所述抽象层是开放的操作系统。
20. 根据权利要求19所述的方法,其中所述开放的操作系统包括Linux内核。
21. 根据权利要求20所述的方法,其中所述安全软件代理符合Linux安全模块。
22. 根据权利要求18-20中任一项所述的方法,其中通过所述安全软件代理限制对所 述抽象层的访问包括:所述安全软件代理防止加载用以扩展所述抽象层的功能的软件代 码。
23. 根据权利要求22所述的方法,其中所述软件代码是可加载内核模块。
24. 根据权利要求23所述的方法,其中通过所述安全软件代理限制对所述抽象层的 访问包括:所述安全软件代理验证所述可加载内核模块,并且防止加载是基于成功的验证 的。
25. 根据权利要求24所述的方法,其中所述安全软件代理基于存储在安全存储器中 的所述可加载内核模块特有的安全信息验证所述可加载内核模块。
26. 根据权利要求22-25中任一项所述的方法,其中所述安全软件代理的一部分被并 入用于加载用以扩展所述抽象层的功能的软件代码的内核工具中。
27. 根据权利要求26所述的方法,其中所述内核工具是加载模块。
28. 根据权利要求18-20中任一项所述的方法,其中通过所述安全软件代理限制对所 述抽象层的访问包括:所述安全软件代理阻止写覆盖指向对所述抽象层的系统调用的至少 一个指针。
29. 根据权利要求18-20中任一项所述的方法,其中通过所述安全软件代理限制对所 述抽象层的访问包括:所述安全软件代理阻止对具有指向系统调用的至少一个指针的系统 调用表进行写入。
30. 根据权利要求28和29中任一项所述的方法,其中所述安全软件代理阻止对包含 所述系统调用表的存储器范围进行写入。
31. 根据权利要求18-20中任一项所述的方法,其中通过所述安全软件代理限制对所 述抽象层的访问包括:所述安全软件代理阻止调试工具请求。
32. 根据权利要求31所述的方法,还包括:所述安全软件代理确定所述调试工具请求 是否尝试附着到已认证应用和所述抽象层的组件中的任一个,并且基于所述确定而阻止所 述调试工具请求。
33. 根据权利要求31和32中任一项所述的方法,其中所述调试工具包括对所述抽象 层的过程追踪系统调用。
34. 根据权利要求31-33中任一项所述的方法,其中所述调试工具是进程跟踪和ADBd 中的任一个。
【文档编号】G06F21/56GK104335220SQ201280073522
【公开日】2015年2月4日 申请日期:2012年3月30日 优先权日:2012年3月30日
【发明者】R.范德吉斯特 申请人:爱迪德加拿大公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1