#memflow #introspection #memory #dma

bin+lib memflow-registry

memflow 插件的类似 Docker 的注册服务器

1 个不稳定版本

0.1.0 2024年7月29日

操作系统 中排名第130

Download history 130/week @ 2024-07-27 5/week @ 2024-08-03 4/week @ 2024-08-10

每月下载量139

MIT 许可协议

54KB
1K SLoC

memflow-registry

用于存储 memflow 插件组件的 Docker 风格注册服务器。

memflow-registry 项目旨在提供一个集中式解决方案,用于管理 memflow 二进制插件。该服务器简化了 memflow 插件的分发和更新,确保用户可以轻松访问适合其 memflow 版本的插件版本。

官方注册表中的所有插件在 memflowup 或 memflow 下载时都进行了加密签名和验证。

功能

  • 组件管理:用户可以下载和探索现有插件。

  • 版本控制:注册表维护插件的版本信息,允许用户根据需要访问特定版本。

  • ABI 兼容性:确保为最终用户提供正确的插件版本,最小化兼容性问题。

  • 分发简化:简化了在不同环境中安装和更新 memflow 插件的过程。

  • 安全性:在上传之前对插件进行加密签名,并由最终用户在客户端进行验证。

入门指南

要开始开发,您只需启动服务器实例

cargo run --release

所有配置都存储在根目录下的 .env 文件中。要自定义设置,将 .env.example 文件复制到 .env 并编辑它。默认的 .env 值是

# enable `info` and higher logs
RUST_LOG=info

# Serve the http api on all interfaces on port 3000
MEMFLOW_ADDR=0.0.0.0:3000

# Store plugin artifacts in `.storage`
MEMFLOW_STORAGE_ROOT=.storage

# Enable file signature verification support in the backend
#MEMFLOW_PUBLIC_KEY_FILE=ec-secp256k1-pub-key.pem

# Enable and set the bearer token which is required to upload and delete artifacts
MEMFLOW_BEARER_TOKEN=token

如果您使用的是默认示例配置,您还必须首先创建 .storage 目录。

如果您想启用并测试文件签名验证,您必须生成用于上传和验证过程中使用的公钥-私钥对。这些密钥必须是 pkcs8 格式的 ecdsa p256k1 密钥。您可以通过以下方式生成密钥对

$ openssl ecparam -name secp256k1 -genkey | openssl pkcs8 -topk8 -nocrypt -out ec-secp256k1-priv-key.pem
$ openssl ec -in ec-secp256k1-priv-key.pem -pubout > ec-secp256k1-pub-key.pem

部署您的实例

官方预构建镜像可在 Docker 仓库 此处 获取。

配置/持久化

可以通过环境变量配置映像。要查看所有可用的变量,请参阅 .env.example 文件。为了开始使用,您很可能会覆盖 MEMFLOW_PUBLIC_KEY_FILEMEMFLOW_BEARER_TOKEN 变量。

映像还配置为将所有工件存储在 /var/lib/memflow-registry/data/mfdata。为了确保数据库在容器重启后仍然可用,请为该文件夹创建一个卷绑定。

可伸缩性

目前,映像不支持水平扩展。请确保只允许一个实例访问存储卷。

通过 cURL 进行测试

上传插件工件

作为第一步,您可能想要上传一个插件。例如,您可以从 assets 文件夹中上传提供的示例二进制文件之一。

# Generate the file signature:
$ openssl dgst -sha256 -hex -sign ec-secp256k1-priv-key.pem memflow-registry-shared/assets/libmemflow_coredump.aarch64.so
EC-SHA256(memflow-registry-shared/assets/libmemflow_coredump.aarch64.so)= 304402200e45acb16e3f01b6f2f04df06eab1a40f8da90cfaa49a8ad987d013a41c7e647022065ff4ab45e543e5c068e4398c0703cf3142ffa6aee31892672dc6937f624e10a

# Set the file signature:
$ export SIGNATURE="304402200e45acb16e3f01b6f2f04df06eab1a40f8da90cfaa49a8ad987d013a41c7e647022065ff4ab45e543e5c068e4398c0703cf3142ffa6aee31892672dc6937f624e10a"

# Run curl with the appropriate Bearer Token and file signature:
$ curl -H "Authorization: Bearer token" -F 'file=@memflow-registry-shared/assets/libmemflow_coredump.aarch64.so' -F "signature=$SIGNATURE" https://127.0.0.1:3000/files

要为文件夹中的所有二进制文件签名和上传,您可以调用上述函数的所有文件。

$ cd assets
$ for i in *; do curl -F "file=@$i" -F "signature=$(openssl dgst -sha256 -hex -sign ../ec-secp256k1-priv-key.pem $i | cut -d' ' -f2)" https://127.0.0.1:3000/files; done

查询所有可用的插件

$ curl -v https://127.0.0.1:3000/plugins
{
  "plugins": [
    {
      "name": "coredump",
      "description": "win32 coredump connector for the memflow physical memory introspection framework"
    }
  ]
}

查找特定的插件变体

$ curl -v https://127.0.0.1:3000/plugins/coredump\?memflow_plugin_version\=1\&file_type\=pe\&architecture\=x86_64
{
  "plugins": [
    {
      "digest": "880e0e255146016e820a5890137599936232ea9bf26053697541f2c579921065",
      "signature": "30440220240ee8af828d459358882eabb7dbb0405a03c2f7bedd9504ec32190267ce9b27022057bdcef318eb0616fc030d028d4d6a1a802f4e6b95567e66a290380e2702f78d",
      "created_at": "2024-03-22T18:14:53.402258600",
      "descriptor": {
        "file_type": "pe",
        "architecture": "x86_64",
        "plugin_version": 1,
        "name": "coredump",
        "version": "0.2.0",
        "description": "win32 coredump connector for the memflow physical memory introspection framework"
      }
    }
  ],
  "skip": 0
}

所有筛选都是可选的。以下是目前可用的筛选器:

  • version - 特定插件的版本,类似于版本标签
  • memflow_plugin_version - memflow abi 版本
  • file_type - pe、elf 或 mach
  • architecture - x86、x86_64、arm 或 arm64
  • digest - 插件二进制的 sha256 校验和
  • digest_short - 插件二进制的 sha256,但裁剪到 7 位数字

此外,此 API 支持通过提供以下参数进行分页:

  • skip - 跳过前 skip 个元素
  • limit - 只显示 limit 个项目

所有插件按上传日期排序。因此,特定变体的最新版本总是在列表中第一个。

下载插件

$ curl -v https://127.0.0.1:3000/files/880e0e255146016e820a5890137599936232ea9bf26053697541f2c579921065 --output file.dll

检索特定插件的元数据

$ curl -v https://127.0.0.1:3000/files/880e0e255146016e820a5890137599936232ea9bf26053697541f2c579921065/metadata
{
  "digest": "30d5292c0acf87cf7a4ebddfcd108230f864609c882a0f7ca26ecbff4b2f5ee6",
  "signature": "3044022030E3E6C64269B29FA2FDE1E62774EAD6EF756C61C31E0A1287C9D55F53951AB302205CEC067CDE046A874701DCA2CD22346E6FD6D86B1ACCCC4CD7FC366E441556F8",
  "created_at": "2024-04-06T20:49:56.440891100",
  "descriptors": [
    {
      "plugin_kind": "connector",
      "export_name": "MEMFLOW_CONNECTOR_COREDUMP",
      "file_type": "elf",
      "architecture": "x86_64",
      "plugin_version": 1,
      "name": "coredump",
      "version": "0.2.0",
      "description": "win32 coredump connector for the memflow physical memory introspection framework"
    }
  ]
}

删除插件二进制文件

$ curl -v -X DELETE -H "Authorization: Bearer token" https://127.0.0.1:3000/files/880e0e255146016e820a5890137599936232ea9bf26053697541f2c579921065

由于插件二进制文件可以包含多个插件,此调用确保从数据库中删除所有插件变体。

路线图

  • 向注册表添加拉取功能,以便最终用户可以更轻松地设置自己的注册表
  • 添加对多个签名密钥的支持
  • 用于浏览插件数据库的 Web UI

贡献

欢迎为 memflow-registry 服务器做出贡献!如果您想做出贡献,请遵循以下指南

  • 将存储库分叉并创建一个新分支以用于您的功能或错误修复。
  • 进行更改并确保所有测试通过。
  • 提交一个包含您更改的清晰描述的拉取请求。

许可

本项目采用 MIT 许可证 - 请参阅 LICENSE 文件以获取详细信息。

依赖项

~22–37MB
~622K SLoC