利用osquery扩展实现Mac EFI固件安全监控

本文详细介绍如何开发osquery扩展程序,通过集成Duo Labs的EFIgy API服务来监控Mac设备的EFI固件版本状态。包含完整的JSON请求示例、扩展开发代码实现和构建部署流程,为系统安全监控提供技术方案。

Trail of Bits发布osquery扩展仓库

今天我们正式开放维护的osquery扩展仓库。首个扩展利用Duo Labs的EFIgy API来检测Mac设备群的EFI固件是否处于最新状态。

目前公开的osquery扩展案例极少,相关文档也严重缺乏。本文旨在帮助开发者掌握编写osquery扩展的完整流程,重点介绍EFIgy扩展的具体实现方案。

EFIgy技术背景

在今年的Ekoparty大会上,Duo Labs发布了关于EFI固件支持状况和安全性的研究成果。这些软件组件对攻击者极具吸引力,因其运行权限级别甚至超过操作系统和虚拟机监控程序。Duo Labs收集分析了苹果近三年所有公开更新,并通过检查73,000多台Mac设备验证数据。

研究发现大量设备运行过时固件,即使主机已正确安装本应包含EFI更新的操作系统补丁。为此Duo Labs创建了EFIgy服务——通过逻辑板ID和产品名称等参数,可访问任何已知苹果产品最新OS和EFI版本的REST端点。

编程查询EFIgy

EFIgy要求传入包含目标系统详情的JSON对象,核心参数包括硬件型号和软件版本:

1
2
3
4
5
6
7
8
9
{
  "board_id": "Mac-66E35819EE2D0D05",
  "smc_ver": "2.37f21",
  "build_num": "16G07",
  "rom_ver": "MBP132.0226.B20",
  "hw_ver": "MacBookPro12,1",
  "os_ver": "10.12.4",
  "hashed_uuid": ""
}

其中rom_ver参数需特殊处理:只需提取点分隔符后的第一、三、四字段。hashed_uuid需将主网卡MAC地址前缀与系统UUID拼接后进行SHA256哈希计算。

通过HTTP POST请求将JSON数据发送至端点https://api.efigy.io/apple/oneshot,服务器返回包含三个JSON对象的响应,用于比对系统更新状态。

开发osquery扩展

为避免手动批量执行EFIgy查询,我们基于Chris Long的创意开发了osquery扩展。选择扩展而非虚拟表的原因在于:所有依赖外部服务或非原生组件的功能均默认采用扩展实现。

开发环境仅限标准库和手动导入的依赖,osquery采用静态链接方式。特别注意不能依赖运行时动态库加载。

表扩展开发需继承osquery::TablePlugin类并重写两个核心方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class MyTable final : public osquery::TablePlugin {
  private:
    osquery::TableColumns columns() const override {
      return {
        std::make_tuple(
          "column_name",
          osquery::TEXT_TYPE,
          osquery::ColumnOptions::DEFAULT
        )
      }
    }

    osquery::QueryData generate(osquery::QueryContext& request) override {
      osquery::Row row;
      row["column_name"] = "value";
      return { row };
    }
};

源文件需放置在osquery/external下以extension_为前缀的目录中。复杂项目可通过ADD_OSQUERY_EXTENSION函数创建CMake编译目标。

使用扩展仓库

我们建立了专属仓库托管扩展代码,EFIgy扩展为首个可用项目。使用前需先克隆osquery完整源码,通过符号链接将扩展源文件链接至osquery/external/extension_<name>目录后执行标准编译流程:

1
2
3
4
5
6
7
8
cd /src/osquery-extensions
ln -s efigy /src/osquery/external/extension_efigy

cd /src/osquery
make sysprep
make deps
make -j `nproc`
make externals

可通过--extension参数加载扩展进行测试。扩展作为独立可执行文件,启动后会自动通过Thrift协议与osquery实例连接并暴露新功能。

行动指南

如果您拥有Mac设备群,现在即可通过osquery和EFIgy扩展监控所有终端设备的软固件更新状态。欢迎访问我们的osquery扩展仓库获取最新资源,也欢迎通过GitHub提交扩展创意或联系定制开发需求。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计