← 最新论文
💻 computer science

Misquoted No More: Securely Extracting F* Programs with IO

本文介绍了 SEIO*,这是一个结合了关系引用与经验证的语法生成的框架,用于将带有 I/O 和细化类型的浅嵌入 F* 程序安全地提取到深嵌入演算中,并提供鲁棒关系超属性保持(RrHP)的机器检查证明,以保证针对任意对抗性链接的安全性。

原作者: Cezar-Constantin Andrici, Abigail Pribisova, Danel Ahman, Catalin Hritcu, Exequiel Rivas, Théo Winterhalter

发布于 2026-07-20
📖 1 分钟阅读☕ 轻松阅读

原作者: Cezar-Constantin Andrici, Abigail Pribisova, Danel Ahman, Catalin Hritcu, Exequiel Rivas, Théo Winterhalter

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

无形的防护网

想象你是一位大师级建筑师,在一个物理定律始终完全符合预期的完美虚构世界中,设计了一辆宏伟的自动驾驶汽车。你用一种特殊的、超精确的语言编写了蓝图,这种语言可以从数学上证明这辆车永远不会碰撞、永远不会在不该刹车时刹车,并且始终遵守交通规则。这就是计算机科学家所说的“形式化验证”(formal verification)。这就像是在一个梦境中建造汽车,你可以 100% 确定每一个螺栓和电线。

但问题在于:那个梦境世界并不存在于现实的道路上。要让汽车真正行驶起来,你必须将你的完美蓝图翻译成真实引擎和轮胎能理解的语言,比如 C 或 OCaml。这个翻译过程被称为“提取”(extraction)。问题是,这个翻译器(执行转换的计算机程序)并不完美。它可能会掉落一个螺栓、扭曲一根电线,或者误解一条规则。如果现实世界的汽车是基于翻译过程中产生的错误构建的,那么你完美的安全性证明就变得毫无用处。汽车在纸面上看起来很安全,但在现实中却可能发生碰撞。

多年来,科学家们一直试图通过在事后检查翻译器的成果来解决这个问题,这有点像机械师在汽车组装完成后进行检查,看它是否符合设计图纸。但本文介绍了一种更聪明的方法:他们不是仅仅检查完工后的汽车,而是在翻译过程中构建一个“安全证书”,从数学上证明真实的汽车是梦境汽车的完美孪生体,即使翻译器出了错也是如此。他们称之为“安全提取”(secure extraction)框架,旨在确保即使你的数字创造物与来自外部世界的、未经验证的混乱代码混合在一起时,依然能够保持安全。


论文的核心思想:“关系引用”(Relational Quotation)魔术技巧

本文的作者们——一支计算机科学家团队——构建了一个名为 SEIO★(IO-star 的安全提取)的新型框架。他们的目标是解决使用 F★ 语言编写的程序的“翻译问题”。F★ 是一种用于编写高度安全软件(如加密工具)的语言。这些 F★ 程序通常是“浅层嵌入”(shallowly embedded)的,这是一种高级且抽象的表达方式,虽然非常适合进行逻辑证明,但对计算机而言很难将其转化为真实的运行代码。

通常,当你将这些抽象程序转化为真实代码时,你需要使用一个“元程序”(metaprogram,即编写程序的程序)来完成繁重的工作。旧的方法是具有风险的:元程序会编写新代码,然后尝试编写一段证明该代码是正确的证明。如果证明失败,你就必须重新开始;如果证明通过了,你仍然必须信任元程序在编写证明的过程中没有偷偷植入 Bug。这就像是要求一名学生在做完作业后自己给自己打分,并寄希望于他没有作弊。

作者们的突破在于一种被称为关系引用(Relational Quotation)的技术。他们不再要求元程序既编写最终代码又编写证明,而是要求它去做一件简单得多的事情:编写一个类型推导(typing derivation)。你可以把它想象成一张步进式的“食谱卡”,上面写着:“第一步:取此原料。第二步:将其与彼原料混合。”这张食谱卡本身并不实际烹饪食物,它只是证明了这些原料可以被烹饪成特定的菜肴。

其中的巧妙之处在于:

  1. 元程序(食谱编写者): 未经验证的元程序观察原始的抽象程序,并生成这张“食谱卡”(类型推导)。因为食谱卡的结构与原始程序完全一致,所以编写它非常容易。
  2. 检查(检查员): F★ 语言本身会对这张食谱卡进行检查。它会询问:“这张食谱是否真的描述了原始程序?”如果元程序犯了错,把原本的汤写成了蛋糕的食谱,检查就会失败。但如果食谱匹配,F★ 语言就能 100% 确定该食谱是有效的。
  3. 经过验证的步骤(主厨): 一旦食谱卡得到验证,一个不同的、经过完全验证的函数(一个被数学证明为完美的“主厨”)会接过那张食谱,并烹饪出最终的成品(真实的运行代码)。因为食谱已被证明与原始程序相符,且主厨被证明会严格按照食谱烹饪,因此最终的成品保证是原始程序的完美孪生体。

这种方法最大限度地减少了我们需要对未经验证的元程序所投入的“信任”。我们只信任它编写食谱,而不信任它烹饪食物或批改作业。最难的部分——证明食物是否安全——是由经过验证的“主厨”来完成的。

“安全编译”的超能力

本文的研究不仅止于确保代码正确,它更进一步确保了代码的安全性。在现实世界中,你的经过验证的程序可能会与一些未经验证的代码链接在一起——也许是黑客编写的代码,或者是来自其他团队的粗糙代码。这种“对抗性”代码会试图破坏你的程序规则。

作者证明了他们的 SEIO★ 框架满足一个极强的安全规则,称为鲁棒关系超属性保持(Robust Relational Hyperproperty Preservation, RrHP)。要理解这一点,请想象你的验证程序是一座堡垒:

  • 旧方法可能会说:“堡垒的墙很坚固,所以它是安全的。”
  • 本文则说:“即使黑客试图从后门潜入,或者试图欺骗守卫,或者试图改变游戏规则,你的堡垒依然会按照你的设计进行运作。”

他们通过两个“逻辑关系”(类似于双面镜)来证明这一点。一面镜子检查真实代码是否实现了抽象代码能够实现的所有功能;另一面镜子检查真实代码是否没有做出抽象代码无法做出的行为。通过同时证明这两点,他们展示了无论与多么混乱的代码链接,真实代码都是原始代码的一个完美且安全的影子。

他们实际做了什么(以及没做什么)

该团队完全在 F★ 语言内部构建了这个框架,并利用计算机检查了证明中的每一个步骤。他们不仅仅是在猜测或模拟,而是通过数学手段进行了证明

  • 有效之处: 他们成功提取了处理文件输入/输出(I/O,即读写文件)并使用“细化类型”(refinement types,即带有额外规则的类型,例如“此数字必须为正数”)的程序。他们证明了即使具备这些复杂特性,提取过程依然是安全的。
  • 仍处于研究阶段的部分: 论文承认,目前的系统在处理递归函数(调用自身的函数)或完整的“依赖类型”(类型取决于值的类型)时,无法以最自然的方式进行处理。他们不得不使用涉及迭代器(循环)的变通方法来处理递归。他们还指出,其元程序有时必须“猜测”在何处放置某些安全检查,这可能显得有些笨拙。
  • 底线结论: 他们并没有解决编程宇宙中的所有问题,但他们构建了一座连接完美证明与混乱现实代码的新型、更安全的桥梁。他们证明了通过将工作拆分为“编写食谱”阶段和“烹饪”阶段,你可以在无需完全信任食谱编写者的情况下,获得强大的安全保障。

简而言之,SEIO★ 是一个新工具,它让程序员能够将完美的、经过验证的思想转化为现实世界的软件,并配备一个数学上保证的安全网,确保即使翻译过程并不完美,最终结果依然能免受外界混乱的影响。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →