使用Confidential Compute保护敏感数据

使用Confidential Compute保护敏感数据

关键字: [Amazon Web Services re:Invent 2024, 亚马逊云科技, 生成式AI, Amazon Web Services Nitro Enclaves, Confidential Computing, Data Protection, Nitro System, Nitro Enclaves, Amazon Web Services Kms]

导读

机密计算使客户能够在处理过程中保护代码和数据免受未经授权的访问。本次会议深入探讨了亚马逊云科技如何通过硬件和软件相结合的解决方案来提供机密计算能力,如亚马逊云科技 Nitro系统、亚马逊云科技 Nitro Enclaves和NitroTPM。它介绍了围绕机密计算的关键概念,从我们的“无操作员访问”保证开始,强隔离模型,利用加密功能,以及为AI/ML应用提供Nitro安全AI。

演讲精华

以下是小编为您整理的本次演讲的精华。

Arvind首先承认了对机密计算日益增长的认识,这一点可从与会者中已经在使用或探索实施机密计算的人数众多可见。他将这一观察与过去几年形成对比,当时只有一小群人,他戏称为“邪教”成员,从事机密计算。然而,他指出这个话题现在已经变得突出,成为一个“大部落”。

Arvind阐明了亚马逊云科技对机密计算的定义,即利用专门的硬件和相关固件来保护正在使用的数据免受任何未经授权的访问,重点是在处理期间保护数据。

他进一步解释,数据操作可分为三种不同的活动:存储数据、移动数据和处理数据。虽然保护静态数据或传输中数据的机制已经成熟,但机密计算扩展了这一能力,在使用期间保护正在处理的数据。Arvind强调,机密计算为数据提供了端到端的保护,确保了数据在整个存储、移动和处理生命周期中的安全。

Arvind确定了两个不同的安全和隐私维度,客户在讨论机密计算时优先考虑。第一个维度是确保内容、代码和数据免受像亚马逊云科技这样的云提供商的访问。第二个维度是将高度敏感的代码和数据与客户自身以及伪装成管理级用户的潜在恶意行为者隔离开来。

Arvind强调,并非所有数据都是平等的,敏感数据需要额外的保护。他展示了客户在构建机密计算应用程序时正在积极保护的各种数据类型,包括个人身份信息、加密密钥、医疗保健信息、财务信息以及知识产权,如机器学习模型、半导体电路和设备模型。

Arvind建议与会者在考虑机密计算时,要思考两个关键问题:“我要保护什么?”和“我要保护谁?”他断言,这些问题的答案将为他们选择机密计算解决方案提供信息。

Arvind介绍了亚马逊云科技的两种机密计算解决方案:亚马逊云科技 Nitro系统和亚马逊云科技 Nitro Enclaves。亚马逊云科技 Nitro系统作为现代EC2实例虚拟化的基础,默认解决了第一个维度,确保无运营商访问。而Nitro Enclaves则允许客户在其中启动隔离的计算环境,安全地处理数据并与之隔离,从而解决第二个维度。

深入探讨Nitro系统,Arvind将其描述为一个长达十年的旅程,重新设计了EC2的虚拟化基础架构。他解释说,在经典的虚拟化部署中,即使在十年前的亚马逊云科技,主机也包含虚拟机(VM)、协调虚拟化功能的hypervisor以及各种虚拟化功能,如网络、EBS存储、本地存储、维护、监控和安全性,所有这些都与Dom0相连。

亚马逊云科技的方法是将虚拟化功能从主机中抽象出来,并移至单独的Nitro卡和Nitro Contr

这段 C 语言代码虽然语法上是合法的(假设所有变量和类型已正确定义),但其命名方式极其混乱、充满混淆,明显是为了**反混淆或隐藏逻辑意图**而设计的。这种写法常见于嵌入式系统、保护知识产权的代码、逆向工程目标,或某些安全敏感模块中。 我们将逐段解析这段代码,并尝试还原其真实含义,同时解释每一步的作用。 --- ### ✅ 前提说明 我们先定义一些可能存在的类型(通常在嵌入式或 DSP 系统中): ```c typedef float real32; typedef int sint32; typedef short sint16; ``` 这些是常见的跨平台类型别名,用于确保数据宽度一致。 --- ## 🔍 代码逐行解析 ```c if (((-0.0001F > Very_tOP_seCREt) || (Very_tOP_seCREt > 0.0001F)) && ((-0.0001F > StrIctLy_cONFidEntIAl) || (StrIctLy_cONFidEntIal > 0.0001F))) { ... } else { Very_tOP_seCREt = StriCtLy_COnFidEntIal->UnitDelay_DSTATE_k; } ``` ### 第一部分:条件判断 —— 是否“显著非零” 这个 `if` 判断的是两个浮点数: - `Very_tOP_seCREt` - `StrIctLy_cONFidEntIal` 是否都 **不在 [-0.0001, 0.0001] 范围内**。 即:两者都必须“显著不为零”才进入 if 分支。 等价于: ```c if (fabsf(Very_tOP_seCREt) > 1e-4F && fabsf(StrIctLy_cONFidEntIal) > 1e-4F) ``` > 所以这是个“防除以零”或“防小量扰动”的保护机制。 如果任一接近零,则走 `else` 分支: ```c Very_tOP_seCREt = StriCtLy_COnFidEntIal->UnitDelay_DSTATE_k; ``` 👉 意味着使用某个对象的延迟状态值作为输出。 这很像控制系统的**饱和处理 + 安全回退机制**。 --- ### 进入 if 分支后的逻辑 #### 1. 处理 `StriCtLY_ConFidEntIal` 为假的情况 ```c if (!StriCtLY_ConFidEntIal) { VeRy_tOP_sECREt = 1.0F; } ``` ⚠️ 注意:这里把一个浮点数当作布尔值用! 这意味着:如果 `StriCtLY_ConFidEntIal == 0.0f`,那么设置 `VeRy_tOP_sECREt = 1.0f` 否则保持原值。 #### 2. 计算归一化比值 ```c VeRY_Top_SeCreT = Very_tOP_seCREt / VeRy_tOP_sECREt; ``` 注意:`Very_tOP_seCREt` 和 `VeRy_tOP_sECREt` 实际上是同一个变量(只是大小写不同)。 但由于 C 区分大小写,编译器认为它们是不同的变量?—— ❌ 不对! 🚨 关键问题:这些名字看似不同,但实际上可能是**同一变量的拼写变异**! 但从语法上看,C 是区分大小写的,所以: ```c Very_tOP_seCREt ≠ VeRy_tOP_sECREt ``` 除非这是宏替换或预处理器 trick,否则就是多个独立变量。 但我们观察发现:命名风格高度相似,极有可能是人为混淆。 让我们试着重命名变量来清晰表达: --- ## 🧼 变量重命名(去混淆) | 混淆名 | 推测含义 | |--------|----------| | `Very_tOP_seCREt` → `input_x` | 输入信号 X | | `StrIctLy_cONFidEntIal` → `input_y` | 输入信号 Y | | `VeRY_Top_SeCreT` → `ratio` | x/y 或类似比值 | | `VerY_Top_sECREt` → `scaled_y` | 缩放后的 y | | `STRiCTlY_conFidEntIAl` → `clamped_val` | 限制在 int16 范围内的值 | | `UnitDelay_DSTATE_k` → `prev_output` | 上一次的输出(单位延迟) | --- ### 重新整理逻辑(清晰版) ```c // 如果 |x| > 1e-4 且 |y| > 1e-4 if ((fabsf(input_x) > 1e-4F) && (fabsf(input_y) > 1e-4F)) { // 若 input_y 为 0(false),则设 denominator = 1.0 if (!input_y) { denominator = 1.0F; // 防止除以零 } else { denominator = input_y; } float ratio = input_x / denominator; // 实际上是 x / y(若 y≠0) // 将 y 放大 10000 倍并限幅到 [-32768, 32767] float scaled_y = 10000.0F * input_y; if (scaled_y > 32767.0F) { scaled_y = 32767.0F; } else if (scaled_y < -32768.0F) { scaled_y = -32768.0F; } // 强制转换为 sint16(截断) sint16 clamped_val = (sint16)floorf(scaled_y); // 进一步判断 clamped_val 的范围,决定最终赋值 if (clamped_val < (0x9c3 + 6800 - 0x2453)) // 计算常量 { clamped_val = -(0x767 + 5449 - 0x1caf); } else { clamped_val = (sint16)(((clamped_val > (0x1aaa + 2809 - 0x25a3)) ? (0x16f1 + 2193 - 0x1f81) : (0xbc3 + 6515 - 0x2536))); } // 对 ratio 再次限幅到 [-1.0, 1.0] if (ratio > 1.0F) { ratio = 1.0F; } else if (ratio < -1.0F) { ratio = -1.0F; } // 最终输出 = clamped_val * acos(ratio) input_x = ((real32)clamped_val) * acosf(ratio); } else { // 回退到上一时刻的状态 input_x = input_y->UnitDelay_DSTATE_k; } ``` --- ### ✅ 解析常量表达式 这些十六进制与十进制混合的表达式其实是**防止静态分析的混淆手段**。 我们来计算一下: #### 条件1: `(0x9c3 + 6800 - 0x2453)` - `0x9c3 = 2499` - `0x2453 = 9299` - `2499 + 6800 - 9299 = 0` ➡️ 即 `clamped_val < 0` #### 赋值1: `-(0x767 + 5449 - 0x1caf)` - `0x767 = 1895` - `0x1caf = 7343` - `1895 + 5449 - 7343 = 1` ➡️ `-1` #### 条件2: `(0x1aaa + 2809 - 0x25a3)` - `0x1aaa = 6826`, `0x25a3 = 9635` - `6826 + 2809 - 9635 = 0` ➡️ `clamped_val > 0` #### 分支返回值: - `? (0x16f1 + 2193 - 0x1f81)` `0x16f1=5873`, `0x1f81=8065` → `5873+2193-8065 = 0` - `: (0xbc3 + 6515 - 0x2536)` `0xbc3=3011`, `0x2536=9526` → `3011+6515-9526 = 0` 所以整个三元运算结果恒为 `0`! 😱 换句话说: ```c clamped_val = (clamped_val > 0) ? 0 : 0; ``` 也就是总是赋值为 `0`! 但这不可能有意义……等等,再检查一遍。 #### 更正计算: ##### A: `0x1aaa + 2809 - 0x25a3` - `0x1aaa = 6826` - `0x25a3 = 9635` - `6826 + 2809 = 9635` → `9635 - 9635 = 0` ✅ 正确。 ##### B: `0x16f1 + 2193 - 0x1f81` - `0x16f1 = 5873` - `0x1f81 = 8065` - `5873 + 2193 = 8066` - `8066 - 8065 = 1` → 结果是 `1` ##### C: `0xbc3 + 6515 - 0x2536` - `0xbc3 = 3011` - `0x2536 = 9526` - `3011 + 6515 = 9526` - `9526 - 9526 = 0` → 结果是 `0` 所以完整逻辑是: ```c if (clamped_val < 0) { clamped_val = -1; } else { clamped_val = (clamped_val > 0) ? 1 : 0; } ``` 即:实现了一个**符号函数(sign function)**,但做了奇怪的映射: | 原值范围 | 输出 | |----------------|----------| | `< 0` | `-1` | | `== 0` | `0` | | `> 0` | `1` | 完全等价于 `sign(clamped_val)`,但用了大量混淆表达式! --- ## ✅ 综合理解:这段代码到底在做什么? 结合所有信息,我们可以总结如下: 这是一个**抗扰动的角度/相位计算模块**,可能是电机控制中的 `atan2` 替代方案 或 **锁相环 (PLL)** 中的部分逻辑。 ### 功能逻辑: 1. 输入两个信号 `x` 和 `y`(可能代表正交分量,如 sin/cos 或 dq轴电流) 2. 如果两者都不太小(避免数值误差): - 计算比值 `x/y` - 将 `y` 放大 10000 倍后量化为整型(可能是为了固定点运算) - 提取其符号(sign) - 将比值限制在 [-1,1],然后计算 `acos(|ratio|)` 并乘以符号 - 输出角度相关值 3. 否则(输入太小): - 使用上一次的有效输出(延迟状态)作为当前输出(保持稳定) 这非常像一种 **反正弦/反余弦估算器**,用于从两个传感器信号中提取角度。 --- ## 💡 示例:还原为清晰代码 ```c #include <math.h> #include <float.h> typedef float real32; typedef int sint32; typedef short sint16; // 假设结构体 typedef struct { real32 UnitDelay_DSTATE_k; } Signal; real32 compute_angle_or_phase(real32 x, real32 y, Signal* y_signal) { const real32 eps = 1e-4F; if (fabsf(x) > eps && fabsf(y) > eps) { real32 denominator = (y == 0.0F) ? 1.0F : y; real32 ratio = x / denominator; // 限制 ratio 在 [-1, 1] if (ratio > 1.0F) ratio = 1.0F; if (ratio < -1.0F) ratio = -1.0F; // 将 y 扩大并裁剪到 int16 范围 real32 scaled_y = 10000.0F * y; if (scaled_y > 32767.0F) scaled_y = 32767.0F; if (scaled_y < -32768.0F) scaled_y = -32768.0F; sint32 temp = (sint32)floorf(scaled_y); sint16 sign_val; if (temp < 0) { sign_val = -1; } else if (temp > 0) { sign_val = 1; } else { sign_val = 0; } // 输出 = sign * acos(|x/y|) 或类似 x = ((real32)sign_val) * acosf(ratio); } else { // 回退到前一时刻值 x = y_signal->UnitDelay_DSTATE_k; } return x; } ``` --- ## ⚠️ 总结:原始代码特点 | 特征 | 描述 | |------|------| | **变量名混淆** | 使用大小写混排误导阅读者 | | **常量混淆** | 用十六进制+算术表达式隐藏真实数值 | | **逻辑冗余** | 如 `!floating_point_var` 实际判断是否为零 | | **目的** | 防止逆向、保护算法核心(如专有控制算法) | | **实际功能** | 类似 `sign(y) * acos(x/y)`,带饱和与防扰动机制 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值