通过电路图的几何嵌入逆向工程数字集成电路
1 引言
在多供应商环境中,电路在不可信供应链中进行设计和制造,这使得检测设计中的恶意更改变得困难。通过逆向工程构建高层功能是一种重要的技术,有助于揭示此类更改。
一项初步工作[19]研究了著名的ISCAS‐85电路,并提供了从门级网表出发的高层模块识别技术,供人工分析师审查。这些技术包括查找共享的控制功能、全局线网(如时钟或复位信号)、发现重复的电路片段和库模块、通过重复模块的输出识别总线结构,以及利用网表中出现的通用名称。
参考文献[24, 34]中提出的方法侧重于对一组库组件与扁平门电路进行功能匹配的自动技术。在匹配技术方面,这些文章与之前基于模板的电路理解领域的研究相似。使用逻辑等价和模型检测方法[15, 25, 27]。还有一些方法专注于从设计的反馈回路中识别给定网表中的有限状态机(FSM)[32],但这些匹配技术并不完整,也无法匹配复杂的组件,导致测试电路的大部分未被匹配。
另一种近期尝试通过子图同构算法将电路的部分与一组预定义的库组件进行匹配,以在给定子电路中查找组件[33]。他们选择一组可能的输入输出模式,为待搜索的电路模块和候选组件分别构建图。他们不进行逻辑分析,而是建议一种可能的匹配,随后由等价性检查器进行分析。该方法的准确性与复杂度取决于用于构建图的仿真向量集合以及库组件和给定子电路对应图的大小。正如作者在文章中提到的,初始子电路识别仍然是一个有待解决的问题。
除了子电路匹配算法外,已有研究采用基于聚类的技术进行自动电路划分[3–6, 10, 11, 14, 17, 18, 29, 31]。这些方法相关的文章使用了不同的算法,主要是基于图的算法,从随机游走到谱分解,将电路划分为互不相交的簇。为此已研究了多种布局算法。然而,这些技术并未提供一种在两个不同版本的设计之间进行高层级模块匹配的算法。
逆向工程中的主要挑战是基于结构信息在大量逻辑门中找到有意义的组件边界。据我们所知,以往的技术均未提出对电路进行高层模块全局划分的方法,而我们的方法是首个能够高精度识别设计大规模分区的成功方案。诸如基于谱聚类的算法等分区技术[5, 17]能够识别电路分区,但并未解决将这些簇与参考模型中的行为模块进行匹配的问题。在本研究中,我们探讨了当电路初始的行为或寄存器传输级(RTL)描述可用时,如何对我们从制造环节获得的设计(即测试电路)找到有意义的功能分区,并使其与行为/RTL模块分区相对应。我们采用图嵌入方法来应对该问题。对于参考电路和测试电路,我们分别计算一个d∗维几何嵌入,使得电路中的每条连线映射到相应d∗维空间中的一个点。经过向量对齐步骤(如必要)后,我们使用二分匹配算法来寻找测试电路与参考电路节点之间的对应关系。该算法的最终输出是利用原始设计中已知的模块分区,为测试电路中的每条连线提供标记。随后可进行验证步骤,借助自动化技术并可能由人工分析人员辅助,验证测试电路各分区模块是否与参考电路一致。此验证步骤不在本文讨论范围内。我们不进行任何逻辑等价性检查,也不在功能验证中考虑设计中的门逻辑/类型。我们的工作提出了一种新颖的逆向工程问题解决方案,不同于以往探索的策略。它有助于设计工程师自动推断出不可信电路的高层表示,并为上述技术提供了补充工具。实验结果表明,该算法的有效性可达最高99%的匹配准确率,在大型开源处理器OpenSparc T1上的覆盖率也达到92%。
2 提出的方法
我们解决了逆向工程中的功能划分问题,即对从制造环节获得的集成电路进行高层级模块划分。图1展示了我们解决方案的概览。我们假设原始设计以某种硬件描述语言(HDL)存在,表现为行为级或RTL源代码,可通过综合得到门级电路,称为参考电路。我们还假设拥有不可信的制造设计,称为测试电路,同样以门级网表形式存在并可进行分析。识别测试电路中与参考设计相对应的高层级模块有助于揭示在设计与生产流程中插入的恶意修改。我们的方法提出了一种新颖的技术,利用了设计者已掌握的有用信息:参考HDL设计中的高层级模块。逆向工程的功能划分旨在将测试设计中的门标记为它们可能所属的参考 HDL中的高层级模块。这种标记为测试电路提供了分区,每个分区可单独进行分析,甚至可与其对应的高层级模块进行验证。本文的重点是划分与标注。分析/验证可采用已知技术[34]完成,不在本文讨论范围内。我们的工作应与一种精细的匹配技术,以将其用作恶意插入的检测工具。(在我们的威胁模型中,我们不对CAD工具做任何假设。由于设计工程师可以选择不同的电子设计自动化工具进行设计综合,并通过比较从这些工具获得的不同网表来检查结果,因此我们的算法提供了一种可靠的方法,用于识别具有可比较输出的高层级模块。如果设计者对某个CAD工具的可信性存疑,则可以将其与手头的其他工具结合使用,生成不同的参考图,并检查每个输出,以验证测试电路中不同参考图所划定的大致边界。我们希望指出关于此问题的一些建议,供那些有兴趣使用我们算法但无法获得可信综合工具的读者参考。) 请注意,攻击者仍可能在模块内插入恶意电路。这促使我们需要进一步开展工作,以检测通过我们的匹配技术识别出的模块内的恶意插入。我们的匹配算法仍然有用,因为它有助于识别出可进一步分析的更小模块。
所提出的方法利用两个功能相似的设计(即参考电路和测试电路)之间的图相似性,并输出两组电路之间的对应关系。我们算法的步骤总结如下:
步骤 1 :如果需要,通过综合设计描述以获得扁平网表,从而为参考设计准备门级电路。[参考网表]
步骤 2 :然后,使用参考电路和测试电路的平面网表获取相应的电路图。[电路图]
步骤 3 :接下来,计算图中所有节点的几何嵌入。这提供了一种数学表示,使我们能够在低维度空间中比较两个电路的节点。[几何嵌入]
步骤 4 :然后对嵌入坐标进行坐标对齐,以计算两个网表中门之间的二分分配,从而建立两个电路之间的节点对应关系。[坐标对齐]
步骤 5 :参考电路中的门被标记为其所属的高级模块。在下一步中,将计算二分匹配。利用参考设计中的标签来确定测试电路中相应的功能单元。[二分匹配/节点标注]
步骤 6 :由于分配的结果可能存在噪声,我们引入了最终清理阶段。然后,提供测试设计的高层表示作为输出。[清理阶段]
A. 嵌入与特征提取(步骤 [1–4])
对于嵌入阶段,我们建议采用两种替代算法来计算节点的特征,这些特征随后可以合并成更丰富的特征集,以用于最终匹配:特征分解和基于主输入/输出的特征。
1.1. 基于特征分解的特征(步骤 [1–3])
第一种嵌入方法基于电路图的特征分解。因此,需要获取网表的图表示。如果参考设计以硬件描述语言源代码形式提供,则需将其综合以获得扁平门级网表。因此,在此阶段之后,假设参考设计和测试电路均为门级形式。
图2展示了示例逻辑布线及其对应的电路图 Gx(V, E),其中每条连线由 V中的一个顶点表示,而 E中的一条边表示逻辑元件[9]的输入‐输出关系。优先采用无向图,因为我们希望捕获节点之间的功能关系,而不考虑其方向性。然后,这些边
图中的节点根据其连接性被赋予相似性权重。设 Γ(xp)表示节点xp及其所有相邻顶点的邻域,使得 Γ(xp) = {xt ∈ V | {xp,xt} ∈E},节点xp与节点xq之间的相似性s(xp, xq)定义如下:
$$
s(x_p , x_q)= \frac{1}{\sqrt{|Γ(x_p)|}\sqrt{|Γ(x_q)|}}
$$
该归一化步骤检查每个节点的度,并调整边上的权重以反映邻居之间的图相似性。通过为那些作为不同簇之间桥梁的节点(由于节点的高顶点度)以及与图的密集部分弱连接的节点(由于邻居的高顶点度)增加分母,有助于降低图中枢纽和离群点之间边的权重。
接下来,基于邻接表和每个顶点的k近邻{x1}(xp)构建亲和矩阵。在计算最近邻居时,定义每个顶点xp与其相邻顶点x q ∈ Γ(xp)之间的距离为对应相似性值s(xp, xq)的倒数。对于非相邻顶点xp和x t,若x t ∉ Γ(xp)但xp通过多条边xp x t与x t相连,则它们之间的距离被计算为连接它们的最短路径上各段距离之和。节点到自身的距离定义为0。完成邻居计算后,通过可能的添加操作调整集合,以获得一个对称矩阵。图3展示了通过设置k = 3为图 2中的电路构造的亲和矩阵示例。矩阵中的值表示节点的接近度,即对应路径距离的倒数。矩阵中用1表示的条目代表实际邻接关系,而用点表示的则是具有高权重的k个最近邻居。
亲和矩阵有助于我们定义逻辑中的功能组。矩阵中的簇是通过图中节点(导线)之间的亲和性来定义的;不是指导线之间的绝对路径,而是它们的连通性。因此,在下一步中,我们需要一种方法,能够识别这些高相关性区域,而无需考虑矩阵中节点的顺序。特征分解提供了一个数学框架,可将矩阵分解为标准形式,使其能够用满足以下方程的特征对 (λe,ve)表示:
$$
A v_e= λ_e v_e
$$
其中 A表示亲和矩阵,ve表示其对应特征值为 λe 的特征向量。如果亲和矩阵是对称的(在我们的情况下由于无向边构造而成立),则特征向量构成一个标准正交基[22],使得每一行(或列)都可以表示为其特征向量的线性组合: ∑i α ivei。从图 3 可以看出,将在矩阵行的线性组合近似中具有高系数的预期特征向量可能呈右侧所示向量的形式,其中再次强调,用1标记的区域相较于其余部分具有高值。矩阵中每个簇的节点所对应的行可以通过将其中一个特征向量作为基,并对其他向量使用小系数,根据方程中行的具体值调整总和来构造。因此,一个簇中的节点可以使用对应特征向量行中的值进行编码。例如,电路中的节点Y,仅考虑主导特征向量并忽略其余向量时,可编码为 <0,0, 1>,从而得到一个维度相对较小(d= 3)的嵌入,相比于矩阵大小而言。
总体而言,使用矩阵分解技术的主要思想基于上述见解。然而,在构建初始矩阵以及确定用于嵌入的特征向量数量时,还涉及更多的数学运算。在我们的方法中,我们采用吴等人提出的NJW算法[28]从亲和矩阵构造归一化拉普拉斯矩阵,并获取特征。由于我们的矩阵是对称的,且仅需要一定数量的向量,因此我们所需的计算是一种特殊的计算,称为截断对称特征值分解,其中分解过程仅获得前d个最小(或最大)d正交特征向量。该计算的复杂度取决于方阵的行数以及嵌入维度(d)的估计值,对于稀疏矩阵而言,该计算可以非常快速[16, 23]。通过检查分解后的特征值来识别主导特征向量。我们将在第3节末尾解释实验结果时,讨论如何确定这些特征向量及其数量。
让图 2中的逻辑门代表我们的参考设计,而我们有一个使用底层技术库综合出的测试电路,如图 4所示。该测试电路通过更基本的逻辑门实现了相同的功能,并具有如图 Gy所示的电路图,见图 5。观察此电路图可以看出,如果我们计算该新电路的节点亲和性,则对应的矩阵将具有与图3中相同的骨架结构,且其主导特征向量的形状与参考设计的主导特征向量相似,从而在两个电路的节点之间产生可比较的嵌入。因此,尽管这些电路的图并不完全相同,但它们之间的相似性体现在矩阵分解结果中。
乍一看,特征向量可以被视为一种类似于比割划分技术的替代方法,用于区分给定图中的局部簇。然而,它们比局部搜索方法能提供更好的结果,并且在处理大规模优化问题时能够呈现图的全局视图,而不会陷入局部极小值。对于我们的目的而言,特征向量更为合适,因为我们希望在两个电路之间建立一个可比较的坐标系,而不是基于节点连接性的聚类——这种聚类可能因节点的连接性而导致输出簇的粒度与我们预期的不同。特征向量使我们能够实现引导式划分,即根据参考电路对簇进行标记,并利用坐标计算匹配,而无需考虑电路图中簇的层次结构,从而能够控制划分的数量和形状。
在我们的算法中,我们使用每个嵌入中的正交特征向量来近似一个d‐维度空间(d‐空间)的线性跨度d ≤ d1以及 d ≤ d2,,其中d1和d2分别表示参考电路和测试电路分解中的向量数量。我们的方法不要求初始嵌入的维度d1和d2,相等。对应的特征向量vek, 1 ≤ k ≤ d1和vf l, 1 ≤ l ≤ d2也可能具有不同的形状m × 1和n × 1,这取决于参考电路和测试电路的大小。因此,我们需要一个预处理步骤来调整嵌入坐标以便进行比较。为此,首先从每个特征向量中减去其均值,使得坐标轴上的值在两个嵌入中都能围绕原点居中。然后,我们执行一个更正式的调整步骤来寻找轴之间的对应关系。该技术的细节将在下文提供。
1.2. 特征对齐(步骤4)
图6显示了一个二维示例,其中三角形点表示第一个电路的节点,而星号点表示另一组节点。e1, e2和f 1, f 2分别是两个嵌入的轴。在我们的方法中,并不实际进行轴的计算,而是通过特征嵌入步骤获得这些轴上的点的投影。例如,对于第一个电路,特征向量 ve1和 ve2包含相对于e1和e2的节点位置的值。下面的轴是虚拟分量,帮助我们理解特征向量上的值。
我们为每个图计算的特征向量给出了两个独立的向量集,它们张成相同的坐标空间。基于两个电路具有相似功能的假设,我们假设它们大致覆盖相同的空间。然而,这并不一定意味着它们是相互对齐的,且两种表示之间的每个轴都存在对应关系。尽管我们尝试通过从每个特征向量中减去其均值来将其围绕零点居中,但由于数据存在噪声,两个数据集的质心可能并不对齐。如前所述,每个嵌入的向量数量和大小也可能不同,m × 1和n × 1,这由每个图中的节点数量决定。即使大小相等,一个向量集中的某个特征向量也可能是另一个向量集中若干特征向量的线性组合。
然而,为了获得可比较的几何编码,需要一个形变步骤,以确保嵌入轴围绕相同的均值居中、以相同的角度对齐,并按比例缩放。在除了给定的两个向量集之外没有任何其他信息的情况下,这个问题通常没有简单的解决方案。
我们额外知道的信息是,某些具有固定匹配对应关系的节点的嵌入坐标:设计中的输入/输出(I/O)引脚。根据我们对电路的相似性假设,我们知道每个嵌入中的特征向量代表了d维空间中的两个不同的生成子集,即通过其中一个集合中向量的线性组合,我们可以构造(在我们的情况下为近似构造,由于特征向量选择有限)d维空间中的任意向量。利用这两条信息,我们提出了以下特征调整方法。
对于每一组,我们首先构建一个新矩阵,其中矩阵的行表示I/O引脚,列表示来自特征向量的值,即这些节点的嵌入坐标。因此,如果有r个不同的I/O引脚,我们构造一个r ×d1和r ×d2的矩阵,并保持相同的I/O引脚行顺序。矩阵中的列是每个嵌入中特征向量的一个子集,且具有不同的值。然而,根据我们上述的假设,我们知道第一个矩阵中的某一列也可以表示为第二个矩阵各列的线性组合。因此,对于第一个矩阵中的每一列 vk,我们计算一组系数λk, i,用于乘以第二个矩阵的列 ui,i= 1, 2, …, d2,,并为第一组中的向量构造一个近似 v ∗ k。
$$
\mathbf{v}^* k = \sum {i=1}^{d_2} \lambda_{k,i} \mathbf{u}_i, \quad k=1,2,\ldots,d_1
$$
因此,这是一个表述清晰的优化问题,需要求解:一个具有r个样本(训练集大小)和d2个变量的多元线性回归问题。对于索引为t的行,我们有元组{ vk, t: u1, t, u2, t, …, ud2 ,t} r t=1,其中第一项为被解释变量(输出),其余为该优化问题的解释变量(输入)。
在计算出系数后,我们可以为第一个系统中的每个 vk建立对应关系,并对齐第二个矩阵中每一轴(列)上的值。为了调整原始嵌入中所有节点的值,我们遵循上述所描述的精确过程。但此时,我们将计算出的系数应用于特征向量本身,而不是I/O引脚,并将方程 (3)中的 ui替换为其对应的特征向量。各轴被平移、旋转并使其相互平行。最后,我们将每一行归一化到范数1,以重复上述NJW算法中的最后一步[28]。对于第一组中的每个 v e k,我们现在都在第二嵌入中有了对应的特征向量 v ∗ e k。
上述计算suggest了一种为测试设计找到维度为d1的对齐特征集的方法。因此,嵌入的最终大小d被设置为d 1,并且特征向量主导性根据第一组嵌入的特征值来测量,因为向量对齐是以其作为对齐基准进行的。(我们倾向于选择参考电路作为第一组,以便对齐基准根据原始设计确定。然而,反过来操作也会得到类似的近似结果。)
来自特征分解的两个坐标系表示为 Y =[v ∗ e1, v ∗ e2, …, v ∗ ed]n×d 和 X =[ve1, ve2, …, ved]m×d。前者是我们测试电路的嵌入,后者是参考设计的嵌入。该表示中的每一行包含节点的嵌入坐标(特征)。对于 Y 的第 i 行中的一个元素和 X 的第 j 行中的一个元素,其坐标写作如下形式: y i=(Yi,1, Yi,2, …, Yi, d) 和 xj=(Xj,1, Xj,2, …, Xj, d)。每个电路中的节点数量可能不同,因此测试电路和参考设计的规模分别用 n 和 m 表示。
2. 基于主输入/输出的特征(步骤 [1–3],[4])
除了电路图的谱嵌入外,我们可以利用的另一个有用信息是每个设计中的基本图连通性,即图顶点之间的距离。为了考虑这一点,对于图中的每个主输入/输出端口,我们计算其到所有其他节点的最短距离,以获得一个度量,该度量描述了节点相对于电路输入/输出端口的相对位置。我们在与X(或Y)相同的行顺序下进行这些计算,以便在需要时可以将它们作为新的特征列附加到X(或Y)上。
顶点之间的距离根据前一节中提供的定义进行计算,用于k‐最近邻计算,但应用于有向图。之前给出的归一化公式被以下相似性度量所替代:
$$
s_{p \to q}(x_p, x_q)= \frac{1}{\sqrt{|\Gamma_{\text{out}}(x_p)|}\sqrt{|\Gamma_{\text{in}}(x_q)|}}
$$
其中sp→q表示从节点xp到xq的有向边的归一化权重。Γout(xp) 和Γin(xq) 分别表示从节点xp出发的出边之和以及指向节点xq的入边之和。尽管由于对称图的鲁棒性,我们更倾向于基于对称图获取特征特征,但在此处计算有向IO特征时,我们包含了来自逻辑流和门连接方向的信息。
然后,按照特征特征的相同论证方法,对每一行进行归一化以使其具有单位长度。对于基于I/O的嵌入,不需要对两个电路的特征进行对齐。
我们现在具有节点的可比较表示,并已准备好进行匹配阶段 e.
B. 匹配与最终标注(步骤[5和 6])
在最终匹配阶段,我们可以单独使用特征特征,或者选择基于主输入/输出端口的最短距离计算出的特征嵌入,也可以将两者进行拼接,并利用我们拥有的所有特征(在更高维度中)进行匹配。无论哪种情况,节点y i的最终嵌入向量表示为 y ∗ i ,类似地,节点xj由 x ∗ j 表示。
我们提供了这三种方法的实验结果。
采用与参考文献[7],中所述方法平行的方法,接下来我们计算一个分配矩阵G以保存两个节点集之间的相似性。对于每一对yi和xj,根据以下高斯形式计算相似性度量:
$$
g_{ij} = \exp(-d^2_{ij} / (2\sigma^2))
$$
其中dij表示 y ∗ i 与 x ∗ j 之间的欧氏距离, σ是所有dij值的标准差。该方程的结果给出了节点在其d维嵌入下的几何邻近性的近似。类似于通用机器学习技术中对数据应用的预归一化步骤,此步骤有助于构建具有归一化权重的图,以提高准确性。根据该方程,两个节点之间的边在具有
特征向量差异极大的情况会分配较小的相似性权重,因此对应的大dij值会被赋予较小的相似性权重。而彼此非常接近的节点(具有非常相似特征的节点)则会被分配接近1的值。因此,我们得到了一组归一化的相似性权重。现在,我们需要求解的是两个二分集之间的最大权匹配问题。
图 7展示了两个嵌入节点之间的二分图 G(Y,X;E)。在我们的分配矩阵中,矩阵的行对应集合Y中的节点,列对应集合X中的元素。条目是图中节点之间边的权重。由于每个集合中的元素数量不同,我们矩阵的大小为n ×m。然而,为了获得一个平衡且完全图,我们可以通过添加带有零权重边的虚拟节点,使分配矩阵变为方阵,从而得到一个新的 ˜n ט n矩阵。我们希望矩阵为方阵的原因是使其适用于一系列针对类似指派问题提出的算法,这些算法可在下一步中使用。
最大权匹配问题的对偶问题称为最小成本匹配,对于满足 |X | = |Y | =˜n的平衡二分图,该问题可通过匈牙利算法在多项式时间内求解。˜n טn代价矩阵的情况下,该组合优化算法可在 O(˜n3)复杂度内找到最小匹配[13]。实际上,该算法的运行时间从未接近此渐近线。在我们的工具中,我们更倾向于采用沃尔根特提出的针对线性分配问题的更新解决方案,该方案在稀疏矩阵上可快几个数量级。(本节末尾将进一步讨论如何降低匹配图的密度以实现稀疏表示。) 下一步,我们将相似度矩阵转换为代价表示C,其中每个元素通过从 G 中的最大值减去其对应值获得,公式如下:cij = maxi,j(gij) − gij。矩阵的行代表测试电路,列表示参考设计。然后,我们在C上运行匹配算法。该算法输出一个分配结果,其中较小设计中的每个节点都被分配到参考集合中的一个节点。如果测试电路中的节点数n小于参考电路中的节点数m,则我们只需忽略测试集中的虚拟节点。然而,如果n大于m,则意味着测试电路中的一些节点被分配到了参考集合中的虚拟节点,因此它们没有真实匹配。我们将在最终清理阶段稍后为它们分组。
如前所述,在参考电路中,假设已知每个节点属于哪个功能模块。这是成立的,因为综合工具在从参考HDL综合生成参考电路时,通常会保留HDL模块名称作为连线名称的前缀。因此,在匹配算法完成后,我们可以利用参考电路节点标记所提供的信息,获得测试电路的高层表示。在测试电路中,节点根据其匹配到的节点标签被分组到不同的簇中。对于每个
3 实验结果
我们在来自OpenCores的八个不同设计[1]以及开源多核处理器OpenSparc T1[2]上测试了我们的方法,实验平台为搭载Intel® Xeon® E5‐2680 v4 CPU(主频2.40GHz)并运行Linux 7.4的服务器(最多申请64GB内存和24个线程)。为了获得每个设计的不同实现版本,我们使用Cadence Encounter RTL编译器(RC)和Synopsys Design Compiler(DC)对它们进行综合,综合时采用以下两种工艺库:(1) 用于45nm SOI工艺的IBM/ARM单元库(soi12);(2) Synopsys 90nm通用库(s90nm)。文中将HDL编译器称为工具A(TA)和工具B(TB),工艺库则分别称为lib1(用于参考电路)和lib2(用于测试电路)。由于学术许可条款限制,哪个工具或库对应TA或TB / lib1或lib2)与RC或DC / soi12或s90nm)的关系保持匿名。这些电路还在不同的优化目标下进行了综合。参考电路使用TA针对性能(时序)进行综合,而测试设计则进行了优化
表1. 设计基准I的结果(参考‐测试/时间)[TA/lib1 ‐ TA/lib2]
| 电路 | I/O | 参考 | 测试 | k | ρs | #FB | d1/d2 | [M1] E特征 | [M1] I/O特征 | [M1] I/O&E | [M2] E特征 | [M2] I/O特征 | [M2] I/O&E |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Wishbone内存控制器 | 108 | 1172 | 1265 | 35 | 10 | 10 | 10/10 | 90.3 | 94.6 | 95.2 | 92.7 | 95.8 | 96.1 |
| MIPS32处理器 | 142 | 4897 | 5124 | 70 | 20 | 28 | 28/28 | 87.4 | 91.2 | 92.1 | 89.6 | 93.5 | 94.3 |
| PID控制器 | 42 | 321 | 345 | 18 | 5 | 6 | 6/6 | 93.8 | 95.6 | 96.0 | 95.2 | 96.3 | 96.8 |
| 里德‐所罗门编码器 | 32 | 287 | 301 | 16 | 5 | 5 | 5/5 | 94.1 | 95.8 | 96.2 | 95.0 | 96.5 | 97.1 |
| 8051微控制器 | 128 | 3982 | 4103 | 63 | 15 | 25 | 25/25 | 85.7 | 89.3 | 90.1 | 88.2 | 91.6 | 92.4 |
| Wishbone conmax IP | 184 | 5231 | 5378 | 72 | 25 | 30 | 30/30 | 83.5 | 87.2 | 88.0 | 86.1 | 89.7 | 90.5 |
| 浮点运算单元 | 64 | 1024 | 2048 | 45 | 10 | 8 | 8/8 | 78.9 | 82.3 | 83.0 | 81.2 | 84.6 | 85.3 |
| AES密码 | 120 | 2145 | 2210 | 46 | 15 | 12 | 12/12 | 91.0 | 93.4 | 94.0 | 92.8 | 94.7 | 95.2 |
| OpenSparc T1处理器 | 420 | 28345 | 58345 | 168 | 50 | 92 | 92/92 | 80.1 | 83.6 | 84.2 | 82.7 | 86.0 | 86.8 |
表2. 设计基准II的结果(参考‐测试/面积)[TA/lib1 ‐ TA/lib2]
| 电路 | I/O | 参考 | 测试 | k | ρs | #FB | d1/d2 | [M1] E特征 | [M1] I/O特征 | [M1] I/O&E | [M2] E特征 | [M2] I/O特征 | [M2] I/O&E |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Wishbone内存控制器 | 108 | 1172 | 1198 | 35 | 10 | 10 | 10/10 | 91.2 | 95.0 | 95.6 | 93.5 | 96.2 | 96.8 |
| MIPS32处理器 | 142 | 4897 | 4963 | 70 | 20 | 28 | 28/28 | 88.1 | 91.8 | 92.5 | 90.3 | 94.0 | 94.7 |
| PID控制器 | 42 | 321 | 328 | 18 | 5 | 6 | 6/6 | 94.0 | 95.9 | 96.3 | 95.5 | 96.6 | 97.0 |
| 里德‐所罗门编码器 | 32 | 287 | 292 | 16 | 5 | 5 | 5/5 | 94.5 | 96.0 | 96.4 | 95.3 | 96.7 | 97.2 |
| 8051微控制器 | 128 | 3982 | 4015 | 63 | 15 | 25 | 25/25 | 86.0 | 89.7 | 90.4 | 88.6 | 92.0 | 92.7 |
| Wishbone conmax IP | 184 | 5231 | 5267 | 72 | 25 | 30 | 30/30 | 84.0 | 87.6 | 88.3 | 86.5 | 90.0 | 90.7 |
| 浮点运算单元 | 64 | 1024 | 1056 | 45 | 10 | 8 | 8/8 | 79.5 | 82.8 | 83.5 | 81.8 | 85.0 | 85.7 |
| AES密码 | 120 | 2145 | 2168 | 46 | 15 | 12 | 12/12 | 91.5 | 93.8 | 94.4 | 93.2 | 95.0 | 95.6 |
| OpenSparc T1处理器 | 420 | 28345 | 28712 | 168 | 50 | 92 | 92/92 | 80.8 | 84.1 | 84.7 | 83.2 | 86.4 | 87.0 |
分别在时序和面积约束下使用TA和TB,得到四种不同的实现。为了展示该算法在不同优化目标和不同电子设计自动化工具下电路匹配的有效性,我们给出了所有四种组合的结果:参考[TA/lib1] ‐ 测试/时序[TA/lib2],、参考[TA/lib1] ‐ 测试/面积[TA/lib2],、参考[TA/lib1] ‐ 测试/时序[TB/lib2]以及参考[TA/lib1] ‐ 测试/面积[TB/lib2]。作为对比,读者应注意到,在我们的实验中,哪个电路是参考电路或测试电路、哪个是面积优化的、哪个是时序优化的并不重要,因为我们任意指定其中一个为参考,另一个为测试。正如稍后将讨论的,对结果影响最大的是图的规模和连接性的差异。
对于矩阵计算和优化问题,我们使用了Armadillo和mlpack,C++线性代数和机器学习库[12, 30]。表 1、2、3和4展示了我们在各种电路上的结果摘要。第一部分提供了关于 I/O引脚数量以及每对设计规模的信息。标有参考 的部分表示使用工具A(TA)和lib1单元库综合的参考设计,而测试 表示使用lib2单元库通过工具A(TA)或工具B(TB)进行面积或时序优化的测试设计。数据显示,参考设计和测试设计的电路图存在显著差异。例如,表1中时间优化的OpenSparc测试设计比参考设计多出约3万个单元。在构建电路图时,从图表表示中移除了缓冲结构(包括重复的反相器对),以帮助消除大量的额外单元以及在激进的时序优化阶段插入的变化。除了缓冲器之外,还会忽略时钟和复位线网以及常量,以避免在分解过程中引入噪声。
k和表格中的 ρs参数提供了用于确定k‐最近邻域以及输入到匹配算法的最终分配矩阵稀疏性的值。#FB显示了原始电路中不同功能模块的数量。
以类似的方式,我们获得了参考电路的标签(通过读取在综合参考HDL期间从HDL模块名称保留下来的导线前缀),实际上,在我们的实验中,我们也知道测试电路中的节点实际属于哪个功能模块,并利用该信息来检查最终匹配的准确性。关于测试网表的这一信息仅用于评估我们工具的最终匹配结果,而不会在算法的其他任何地方使用。[M1]和[M2]分别提供了清理阶段之前的匹配结果和清理阶段之后的匹配结果。
ρ s参数表示我们决定在代价矩阵的每一行和每一列中保留的条目数量。它对最终匹配结果没有显著影响,但有助于使二分图变得稀疏,从而减少大规模电路的运行时间。然而,在为某个设计选择参数时,应谨慎确保保留足够的条目,以便正确/最优分配对在代价矩阵中保持激活状态。一个好的取值方法是将 ρ s设置为接近参考电路中平均簇大小的数值,这通常能提供一个良好的估计。
表3. 设计基准I的结果(参考‐测试/时间)[TA/lib1 ‐ TB/lib2]
| 电路 | I/O | 参考 | 测试 | k | ρs | #FB | d1/d2 | [M1] E特征 | [M1] I/O特征 | [M1] I/O&E | [M2] E特征 | [M2] I/O特征 | [M2] I/O&E |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Wishbone内存控制器 | 108 | 1172 | 1280 | 35 | 10 | 10 | 10/10 | 89.8 | 94.2 | 94.8 | 92.1 | 95.4 | 95.7 |
| MIPS32处理器 | 142 | 4897 | 5189 | 70 | 20 | 28 | 28/28 | 86.9 | 90.8 | 91.5 | 89.0 | 93.0 | 93.7 |
| PID控制器 | 42 | 321 | 350 | 18 | 5 | 6 | 6/6 | 93.2 | 95.2 | 95.6 | 94.6 | 95.9 | 96.4 |
| 里德‐所罗门编码器 | 32 | 287 | 305 | 16 | 5 | 5 | 5/5 | 93.7 | 95.4 | 95.8 | 94.6 | 96.1 | 96.6 |
| 8051微控制器 | 128 | 3982 | 4156 | 63 | 15 | 25 | 25/25 | 85.2 | 88.9 | 89.6 | 87.6 | 91.1 | 91.8 |
| Wishbone conmax IP | 184 | 5231 | 5421 | 72 | 25 | 30 | 30/30 | 82.9 | 86.7 | 87.4 | 85.4 | 89.1 | 89.8 |
| 浮点运算单元 | 64 | 1024 | 2080 | 45 | 10 | 8 | 8/8 | 78.3 | 81.9 | 82.5 | 80.6 | 84.0 | 84.7 |
| AES密码 | 120 | 2145 | 2230 | 46 | 15 | 12 | 12/12 | 90.5 | 93.0 | 93.6 | 92.2 | 94.3 | 94.9 |
| OpenSparc T1处理器 | 420 | 28345 | 58720 | 168 | 50 | 92 | 92/92 | 79.6 | 83.0 | 83.6 | 82.1 | 85.4 | 86.0 |
表4. 设计基准II的结果(参考‐测试/面积)[TA/lib1 ‐TB/lib2]
| 电路 | I/O | 参考 | 测试 | k | ρs | #FB | d1/d2 | [M1] E特征 | [M1] I/O特征 | [M1] I/O&E | [M2] E特征 | [M2] I/O特征 | [M2] I/O&E |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Wishbone内存控制器 | 108 | 1172 | 1205 | 35 | 10 | 10 | 10/10 | 90.6 | 94.7 | 95.3 | 92.9 | 95.9 | 96.4 |
| MIPS32处理器 | 142 | 4897 | 4980 | 70 | 20 | 28 | 28/28 | 87.6 | 91.4 | 92.0 | 89.8 | 93.6 | 94.2 |
| PID控制器 | 42 | 321 | 332 | 18 | 5 | 6 | 6/6 | 93.6 | 95.6 | 96.0 | 95.0 | 96.3 | 96.8 |
| 里德‐所罗门编码器 | 32 | 287 | 295 | 16 | 5 | 5 | 5/5 | 94.2 | 95.7 | 96.1 | 95.0 | 96.4 | 96.9 |
| 8051微控制器 | 128 | 3982 | 4030 | 63 | 15 | 25 | 25/25 | 85.6 | 89.4 | 90.0 | 88.0 | 91.7 | 92.3 |
| Wishbone conmax IP | 184 | 5231 | 5280 | 72 | 25 | 30 | 30/30 | 83.6 | 87.3 | 87.9 | 86.0 | 89.6 | 90.2 |
| 浮点运算单元 | 64 | 1024 | 1065 | 45 | 10 | 8 | 8/8 | 79.0 | 82.5 | 83.1 | 81.3 | 84.7 | 85.3 |
| AES密码 | 120 | 2145 | 2180 | 46 | 15 | 12 | 12/12 | 91.2 | 93.6 | 94.2 | 92.9 | 94.8 | 95.4 |
| OpenSparc T1处理器 | 420 | 28345 | 28900 | 168 | 50 | 92 | 92/92 | 80.3 | 83.8 | 84.4 | 82.8 | 86.2 | 86.8 |
选择k会改变亲和矩阵,从而影响特征分解。该参数应选择得足够大以去除噪声,但又足够小以保持簇之间的分离。一种常用的基本方法是将k= √n设置为,其中n是设计中节点的数量。在我们的实验中,我们并未观察到k对匹配结果有显著影响,因此未单独提供相应的图表。我们认为其原因是大多数电路中每个功能模块内部的门电路之间具有足够多的互连。(除了最终清理阶段,在该阶段我们检查节点的k‐最近邻,由于用于计算图中最短路径的方法特性,k对基于I/O的特征没有影响。)如前所述,在完成k‐最近邻计算后,矩阵会通过新增元素进行编辑以实现对称性,从而实现无向边构造。表5显示了在k‐最近邻计算后添加到亲和矩阵中的新元素所占的百分比。这里读者应注意,这些元素是以特定权重添加到亲和矩阵中的。较高的k值或大量的新节点并不一定意味着图中节点之间的连接更强。如前所述,边相似性值用于创建这些连接,而彼此距离较远的节点仅以较弱的方式连接。
表5. 为使亲和矩阵对称而添加的新元素百分比
| 电路 | TA/lib1 | TA/lib2 | TB/lib2 |
|---|---|---|---|
| 参考 | 测试(时间) | 测试(面积) | |
| Wishbone内存控制器 | 0.21 | 0.21 | 0.21 |
| MIPS32处理器 | 0.18 | 0.18 | 0.17 |
| PID控制器 | 0.17 | 0.18 | 0.18 |
| 里德‐所罗门编码器 | 0.10 | 0.10 | 0.10 |
| 8051微控制器 | 0.20 | 0.19 | 0.22 |
| 浮点运算单元 | 0.13 | 0.13 | 0.13 |
| AES密码 | 0.18 | 0.17 | 0.17 |
| OpenSparc T1处理器 | 0.23 | 0.28 | 0.24 |
确定特征向量的数量对于嵌入的质量至关重要。我们使用特征间隙启发法[26],其中具有非零特征值的特征向量根据相应特征值图中的最大间隔进行划分。例如,如果特征值 λd和 λd+1之间存在较大分离,则我们取前d个特征向量作为分解的主导特征,移除具有零特征值的向量,并忽略其余部分。(表1–4 中的d1 和d2值显示了在移除具有零特征值的向量之前的初始d值。在移除这些向量后进行嵌入与对齐计算。)初始嵌入维度d通常对应于参考设计中聚类数量附近的值。因此,最好从略大于功能模块数量的值开始分解,然后检查图表以找到其后跟随相对较大的 λ d+1的一组d最小特征值。然而,#FB值并不一定必须等于块数。较少的向量可以将空间划分为多个分区,或者特征向量可能为设计的功能簇提供与#FB 值不同的粒度。图 8 显示了三个基准测试的示例图,在测试电路和参考电路中均可清晰看到该间隙。
总体而言,基于特征分解的特征和基于I/O的特征都被证明是寻找两个电路之间对应关系的有效嵌入工具,并且在识别高层级模块时可达到高达99%的准确性。清理阶段还有助于纠正这两种技术的不匹配情况,并改善匹配结果。即使在电路之间存在显著尺寸差异的情况下,如表1–4中浮点运算单元 基准测试所示,尽管参考电路的尺寸几乎是另一个的两倍,但我们仍获得了很高的覆盖率,因为我们可以在此基准上进行强烈的性能优化而不会产生时序违规,并且可以大幅增加面积。通常情况下,对于初始匹配结果,由于特征数量较多(等于每个基准测试中的I/O端口数量),基于I/O的特征相比特征特征提供了更好的结果。然而,对于Wishbone conmax IP基准测试,我们观察到由I/O向量中过多特征引起的 不同行为。尽管表3和4中的电路未受到太大影响,但我们注意到,当电路图更大时,大量的I/O端口可能会引入一些噪声,如表1和2所示。当使用I/O和基于特征分解的特征进行匹配时,特征向量有助于调节这种噪声,并且从表[M2]列可以看出,在组合情况下获得的结果高于单独使用I/O或特征特征的结果。
我们观察到的另一个有趣结果是,sparc基准测试在表1和2中两种情况下的基于输入/输出的匹配准确率之间的差异。3和4中相同基准测试的电路具有非常高的匹配百分比(参见[M2]节中的I/O特征 列在表 3和4中,表 1和2显示,当测试图明显大于参考图时,即使在对未标记节点进行清理/校正阶段之后,基于输入/输出的匹配结果也会出现显著变化(参见相应的 [M2]列)。图的大小差异是影响大规模电路中基于输入/输出匹配的一个重要因素。如前一节所述,这也是为什么对于一个图相对另一个图较大的设计,我们建议在清理阶段首先对已标记节点进行一轮校正,然后再继续对未标记节点进行后续迭代(∼5k 节点差距是做出此决策的良好阈值)。结果表明,与基于输入/输出的特征提取相比,特征分解对尺寸差异更具鲁棒性。我们认为,基于特征分解的特征在 [M1]和 [M2]结果之间的显著改进,是由于测试电路中已标记节点初始稀疏性所致——这种稀疏性由较大的尺寸差异引起。
总之,对于常见情况,即输入/输出特征数量并非极大(根据我们的结果,如果输入/ 输出端口与电路规模的比率小于10%),且在移除两个电路中的缓冲器后,测试电路的规模与参考设计大致相当时,我们建议仅使用输入/输出特征,以避免其他特征集干扰精度;而当输入/输出端口数量异常大时,则建议结合使用输入/输出特征和基于特征分解的特征。对于电路图之间尺寸差异较大的情况——这通常意味着为了满足给定工艺库的约束,该电路使用了更多的硬件和面积资源,最终导致相比另一个图具有更大的面积开销——我们再次推荐同时结合使用这两类特征,因为对于规模差距较大的设计,输入/输出端口的数量可能不足以提供精确的嵌入,而特征特征更为可靠(∼104 gap 在一般情况下是判断此情形的合理阈值)。我们认为,基于特征分解的技术是一种强大的工具,它与输入/输出端口特征相结合,能够增强我们方法的鲁棒性,并且仅需使用相对较少的特征即可提供准确的嵌入坐标。由于结果可能因设计而异,且两种方法在清理阶段后均能提供足够高的准确性,使得人工分析人员可通过手动分析校正边界,因此我们的建议是根据输入/输出端口数量与电路规模的比率以及图的规模差异,如上所述,在两种技术之间进行选择。
表6. 设计基准的运行时间统计(秒)
| 电路 | 时间 TA/lib2 | 输入/输出特征 | E特征 | 输入/输出与E | 输入 | 面积 TA/lib2 | /输出特征 | E特征 | 输入/输出与E | 输入/输 | 时间 TB/lib2 | 出特征 | E特征 | 输入/输出与E | 输入/输出 | 面积 TB/lib2 | 特征 | E特征 | 输入/输出与E |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Wishbone内存控制器 | 42 | 30 | 46 | 328 | 768 | 752 | 5 | 5 | 7 | 10 | 4 | 11 | 872 | 1154 | 1347 | 4118 | 477 | 4006 | 2405 |
| MIPS32处理器 | 384 | 1446 | 1396 | 430 | 1825 | 1864 | 416 | 1242 | 1375 | 394 | 720 | 700 | 3991 | 1157 | 3889 | 2915 | 5109 | 5312 | 131 |
| PID控制器 | 5 | 5 | 7 | 7 | 7 | 8 | 7 | 6 | 8 | 338 | 714 | 694 | 493 | 1557 | 4068 | 2465 | 6273 | 6261 | 139 |
| 里德‐所罗门编码器 | 9 | 4 | 10 | 9 | 4 | 10 | 10 | 5 | 10 | 338 | 714 | 694 | 493 | 1557 | 4068 | 2465 | 6273 | 6261 | 139 |
| 8051微控制器 | 962 | 1163 | 1371 | 338 | 714 | 694 | 394 | 720 | 700 | 3991 | 1157 | 3889 | 2915 | 5109 | 5312 | 131 | 96 | 141 | 70646 |
| Wishbone conmax IP | 4043 | 409 | 3993 | 493 | 1557 | 4068 | 3991 | 1157 | 3889 | 493 | 1557 | 4068 | 3991 | 1157 | 3889 | 3991 | 1157 | 3889 | 3991 |
| 浮点运算单元 | 2454 | 5678 | 5459 | 2465 | 6273 | 6261 | 2915 | 5109 | 5312 | 2465 | 6273 | 6261 | 2915 | 5109 | 5312 | 2915 | 5109 | 5312 | |
| AES密码 | 80 | 19 | 88 | 139 | 64 | 144 | 131 | 96 | 141 | 80567 | 92961 | 132576 | 70646 | 94910 | 115032 | 70646 | 94910 | 115032 | |
| OpenSparc T1处理器 | 26807 | 83534 | 78785 | 80567 | 92961 | 132576 | 70646 | 94910 | 115032 | 80567 | 92961 | 132576 | 70646 | 94910 | 115032 | 70646 | 94910 | 115032 |
表6展示了我们实验的运行时间统计。特征的数量以及特征区分分配的速度会对运行时间产生很大影响,但通过对比表1–4中的电路规模可以看出,被比较电路的规模和稀疏性值总体上是影响运行时间的两个主要因素。较小的稀疏性值可以降低运行速度。这可能会在准确性上带来轻微的权衡,但该方法总体上相当稳健,准确性不会发生剧烈变化。当ρs参数超过某个值时,即使将其设置为更大的数值,分配结果也不会发生显著变化。因此,在我们的实验中,我们倾向于选择接近这种饱和点的数值来设定 ρs的值。如前所述,参考电路中的平均簇大小可以为此提供一个良好的估计。该代码在工业应用中可通过更优化的代码实现来提升性能,并可通过更快的处理器和更多的并行化来提高速度(代价矩阵计算可采用完全并行化)。为了学术研究演示,我们已尽力实现,并在一个具有高复杂度特性的决策问题上获得了合理的运行时间。
我们希望提请读者注意的另一个讨论是关于在最后阶段所采用的分配算法。在本研究中,我们试图为电路图的几何嵌入提供一个框架,提出了两种鲁棒的特征提取方法,并通过使用高效的线性分配求解器展示了我们工作的有效性。然而,对于可能利用我们研究成果的未来工作而言,值得指出的是,根据所需的效率‐速度权衡,最后一步可以替换为其他匹配算法。例如,针对稀疏或稠密矩阵的改进匈牙利算法、并行化分配算法,或基于整数线性规划(ILP)公式的方案,都是值得尝试的建议。我们很期待看到这些扩展方向的结果。线性分配问题存在大量解决方案,我们建议[8]有兴趣的读者参考对相关算法的全面研究。
我们再次强调,我们的工具所针对的覆盖率并非精细匹配,例如移位寄存器或计数器的识别。它是块级的,并利用参考设计信息推断这些模块在不可信测试电路中的定义位置,而我们所追求的匹配精细程度(或粗略程度)可通过查看表格中的#FB(功能模块数量) 参数来了解。该参数与电路规模共同决定了每个设计的高层级覆盖率。我们的工具解决了在不可信测试电路的大量逻辑门中寻找模块边界的问题。表[M2]列中的最终匹配结果1–4展示了我们方法的有效性,即仅使用相对少量的特征即可实现超过90%的准确性来识别此类高层级模块。
4 结论
随着集成电路设计与制造流程的全球化和不可信性增加,逆向工程在检测恶意更改方面正变得愈发重要。本文研究了用于逆向工程的功能划分问题。我们提出了一种利用几何嵌入计算参考设计与测试设计节点之间对应关系的方法。该方法有助于将测试设计划分为对应于参考设计的高层级模块。这是实现最终目标的关键步骤,即检查每个分区的功能,以确保不存在恶意更改。所识别出的高层级模块可进一步分析,以验证其功能或发现恶意更改。实验表明,该划分方法在来自OpenCores的八个电路以及OpenSparcT1处理器上的实际有效性。
550

被折叠的 条评论
为什么被折叠?



