Microsoft Windows CE 版本 3.0
摘要:本文高度概括了 Windows CE 3.0 中为设备和应用程序提供安全性的不同选项。本文假定读者熟悉基本的 Microsoft 安全技术和 Win32 应用程序编程接口 (API)。
简介安全服务是现代操作系统的核心部分。网络基础结构、系统管理策略和最终用户的感受都取决于安全服务的管理功能、灵活性和实施。Microsoft® Windows® CE 3.0 通过提供安全服务的集成功能集,使企业在日益增长的网络世界中不断扩展,且无须牺牲安全性。安全服务包括以下功能:
- 信任环境模型。
- 安全性支持提供者接口 (SSPI)。
- Windows NT® LAN Manager 支持。
- 安全套接字层 (SSL) 支持。
- 加密技术。
- 支持 CryptoAPI 的智能卡基础结构。
- 唯一的设备标识符。
- 受保护的内核配置。
- 拨号启动加载程序中的数字身份验证。
创建信任环境
Windows CE 设备发送、接收和处理需要保护(以避免潜在的不安全应用程序)的信息。那么,如何保护您的设备呢?您可以创建一个安全操作系统 (OS),防止加载未知模块、限制对系统 API 的访问、并禁止对系统注册表的某些部分执行写入操作。
要创建信任环境,必须实现下面两个函数:
- OEMCertifyModuleInit
- OEMCertifyModule
在内核加载应用程序之前,OEMCertifyModule 函数验证应用程序签名,以避免非法应用程序进入您的系统。这可以确保仅当应用程序包含有效的数字签名时,才能够被基于 Windows CE 的平台加载。OEMCertifyModule 函数返回以下三个选项之一:
- 完全信任,可以执行任何操作。
- 有限信任,调用某些函数时受限制。
- 不信任,因此不允许运行。
下表对这两个函数加以说明。
函数 | 说明 | 返回值 |
OEMCertifyModuleInit | 启用 OS 加载程序来通知 OEM 有一个新的模块正在加载。允许 OEM 决定是否验证该模块以确保安全。 | TRUE 或 FALSE |
OEMCertifyModule | 允许 OS 加载程序将模块代码(例如,DLL、EXE 和 OCX)传递给 OEM,以验证该模块是否可以在系统中安全地运行。 | OEM_CERTIFY_TRUST OEM_CERTIFY_RUN OEM_CERTIFY_FALSE |
下表说明 OEMCertifyModule 函数的返回值。
返回值 | 说明 |
OEM_CERTIFY_TRUST | 信任应用程序,可以执行任何操作。 |
OEM_CERTIFY_RUN | 信任应用程序,可以运行,但不能调用任何特权函数。 |
OEM_CERTIFY_FALSE | 不信任,因此不允许运行。 |
OEMCertifyModule 函数可以对正在加载的模块进行任何类型的检查,例如,循环冗余检查或证书检查。当动态链接库 (DLL) 加载到某 EXE 程序的地址空间时,EXE 的信任级别将决定最终的访问级别。例如,如果 OEM_CERTIFY_RUN 信任级别的 EXE 试图加载具有较低信任级别 (OEM_CERTIFY_TRUST) 的 DLL 时,DLL 的最终信任级别是 OEM_CERTIFY_RUN。另一方面,如果 EXE 试图加载具有较高信任级别的 DLL 时,加载操作将失败。
下表显示 EXE 和 DLL 信任级别的不同组合方式。
EXE 信任 | DLL 信任 | 最终 DLL 信任 |
OEM_CERTIFY_RUN | OEM_CERTIFY_RUN | OEM_CERTIFY_RUN |
OEM_CERTIFY_RUN | OEM_CERTIFY_TRUST | OEM_CERTIFY_RUN |
OEM_CERTIFY_TRUST | OEM_CERTIFY_RUN | 加载 DLL 失败 |
OEM_CERTIFY_TRUST | OEM_CERTIFY_TRUST | OEM_CERTIFY_TRUST |
注意: OEM 必须对所有第三方驱动程序进行数字签名,否则加载驱动程序时将失败。实现此安全模型时,所有驱动程序都必须受信任。
要实现信任模型,最简单的方法是使用 OEMCertifyModule 函数,为所有应用程序返回 OEM_CERTIFY_RUN。从而使映像的非 ROM MODULES 部分的应用程序可以运行,但是对特权函数的调用会受到限制。通过这种方法,您不必指定运行时哪个应用程序是否受信任。如果返回的是 OEM_CERTIFY_FALSE,那么 RAM 中的应用程序将不能运行。在任何情况下,位于映像的 ROM MODULES 部分中的操作系统文件总是以最高权限运行。
要创建数字签名,您可以使用 Signfile.exe,该程序包含在 Platform Builder 3.0 中。Signfile.exe 是用私人密钥为可执行文件签名的工具,使用 Secure Hash Algorithm (SHA) 计算加密散列。关于 Signfile.exe 代码的示例,请参见 Platform Builder 3.0 产品 CD 中的 PublicCommonOakToolSignfile。
要在加载时验证签名,您可以使用 Loadauth.lib 函数,该函数在 PublicCommonOakLib 中与处理器对应的 Platform Builder 目录中。关于使用 Loadauth.lib 函数的详细信息,请参见 Platform Builder 3.0 文档。
您也可以不使用 Platform Builder 工具,而编写自己的签名验证方案。
下面的代码是使用 Loadauth.lib 函数实现 OEMCertifyModuleInit 和 OEMCertifyModule 函数的示例:
/* 签名公共密钥 BLOB */ const unsigned char g_bSignPublicKeyBlob[] = { 0x06,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x31,0x00,0x02, 0x00,0x00,0x01,0x00,0x01,0x00,0xb1,0x00,0x93,0x7c,0x18,0x63,0xce,0xf3, 0x23,0xe3,0x57,0x74,0x13,0x54,0x17,0x2c,0xdb,0xf6,0x56,0x77,0xb3,0x8d, 0x34,0x6c,0x41,0x3d,0x4e,0xbb,0xc1,0xaf,0x3d,0x17,0xb6,0x0e,0x70,0x72, 0x43,0x12,0x1d,0xb1,0x2a,0x57,0x05,0x27,0x58,0x63,0xef,0xb7,0x3b,0x71, 0xee,0xe4,0xcd,0x14,0xbe,0xf7,0x32,0xec,0xa2,0xae,0xbf,0x9a,0x6b,0x75 }; // RAM 可执行程序加载时签名检查 // 的声明 typedef BOOL (* OEMLoadInit_t)(LPWSTR lpszName); typedef DWORD (* OEMLoadModule_t)(LPBYTE lpData, DWORD cbData); extern OEMLoadInit_t pOEMLoadInit; extern OEMLoadModule_t pOEMLoadModule; extern BOOL InitPubKey(const BYTE *KeyBlob, DWORD cbKeyBlob); // Loadauth 库例程 extern BOOL CertifyModuleInit(void); extern BOOL CertifyModule(PBYTE pbBlock, DWORD cbBlock); extern BOOL CertifyModuleFinal(PBYTE *ppbSignData, PDWORD pcbSignData); // 为每个 RAM 可执行模块调用一次 // 以初始化签名检查 static BOOL OEMCertifyInit(LPWSTR lpszName)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126703/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10294527/viewspace-126703/