Elixir 中的行为清理器

主要观点:

  • 介绍了在不同编程环境中与“行为清理器”的工作,如 Clang 的 C 和 C++编译器、Java 的 Jazzer 等,它们用于检测漏洞,触发时会立即停止被测系统。
  • 阐述了 Erlang 的 Trace 模块,可用于发送函数调用报告,通过示例展示了如何在 Erlang 和 Elixir 中设置和使用追踪。
  • 以 Elixir 代码为例,找到与 PostgreSQL 数据库交互的 postgrex 库中的查询部分,通过追踪 DBConnection.prepare_execute/4 函数来获取查询信息。
  • 提出用“清理而不是检查”的方式,实现一个 GenServer 来检测可能的 SQL 注入,若发现魔法字符串 __sanitizer__ 则杀死连接和调用进程,但该方法存在风险,仅为原型且未在生产环境中运行。
  • 展望未来工作,认为该方法在模糊测试中可能有用,但目前 BEAM 世界中模糊测试并不常见,且表示有更多项目和想法但时间有限。

关键信息和重要细节:

  • Clang 的 AddressSanitizer 设计为检测到错误时立即退出,以产生更快更小的代码,但会导致程序崩溃,不适合在生产环境中运行。
  • Erlang 的 Trace 模块通过 trace 模块可创建追踪器进程、设置追踪会话和追踪函数调用,示例展示了在 Erlang 和 Elixir 中的使用。
  • 找到 postgrex 库中通过 DBConnection.prepare_execute/4 函数发送查询的部分,并获取相关信息。
  • 实现的 GenServer 用于检测 SQL 注入,通过 maybe_alert/4 函数判断是否存在注入,若存在则杀死连接和调用进程,该方法有测试但存在风险。
  • 未来可在模糊测试等方面进一步研究该方法,但目前时间有限。

引用和注释:

  1. lists:seq/2 是 Erlang 中标识函数的标准方式,Erlang 模块和函数用小写名称加冒号分隔,/2表示双参数版本,在 Elixir 中用 :lists.seq(1, 10) 调用。
  2. 在 BEAM 世界中,状态存在于进程中,不像 Ruby 或 Java 那样有连接对象。
  3. “arity”指参数数量。
阅读 12
0 条评论