AmirhosseinHonardoust/Python-Solidity-Feature-Engineering
GitHub: AmirhosseinHonardoust/Python-Solidity-Feature-Engineering
基于 Python 的特征工程工具链,将 Solidity 代码转化为结构化安全信号并评估风险。
Stars: 20 | Forks: 0
# **如何教 Python 读取 Solidity 代码:区块链安全中的特征工程**
智能合约安全已成为现代计算中最关键的问题之一。数十亿美元的资金现在通过去中心化应用流动,但平均而言,Solidity 合约仍是手写编写、审查不足,并且经常在没有有意义的自动化分析的情况下部署。
静态分析工具是存在的,例如 Slither、Mythril、Scribble,但它们是安全专家构建的庞大复杂系统。如果你想要更简单、更易于理解和修改、更易于集成到自定义流水线或研究实验中的工具呢?
在这篇文章中,我们正是构建了这样的工具:
**一个基于 Python 的特征提取系统,能够读取 Solidity 代码并将其转化为结构化的安全信号。**
这并不是要构建一个完整的审计器。相反,它是关于理解 **Python 如何学会“阅读”Solidity**,识别风险模式,并生成可用于启发式评分或机器学习的功能特征。
## 为什么特征工程在智能合约安全中至关重要
在能够检测漏洞、分类风险代码或训练 AI 模型审计合约之前,你首先需要一样东西:
**信号(Signal)。**
像重入攻击、预言机操纵、委托调用滥用和访问控制错误等经典漏洞会在代码中留下可检测的指纹。这些指纹就是 **特征**。
示例:
| 漏洞类型 | 可能特征 |
| -------------------- | --------------------------------------------------------- |
| 重入攻击 | 存在 `call{value:}` 或在状态更新之前的外部调用 |
| 访问控制错误 | 缺乏 `require(msg.sender == owner)` 的 setter 函数 |
| 预言机操纵 | 没有检查的公共状态变更 |
| 委托调用注入 | 直接使用 `delegatecall` 或代理模式 |
| 攻击面扩大 | `public` / `payable` 函数数量较多 |
| 燃气攻击(Gas griefing) | 对动态数组/映射的循环操作 |
大多数真实审计师依赖心理模型:
我们可以将这些直觉编码为 Python。
## 第一步:使用 Python 读取 Solidity 代码
最简单的 Solidity 解释器就是:
```
from pathlib import Path
def read_source(path):
return Path(path).read_text(encoding="utf-8")
```
但这些原始文本目前还没有意义。
我们需要将其转化为 **特征**。
## 第二步:提取低级特征(正则信号)
正则表达式在识别危险的底层构造方面出人意料地有效。
以下每一项都是一种安全“异味”:
### **危险操作码**
* `delegatecall`
* `call.value`
* `tx.origin`
* `selfdestruct`
### **攻击面指标**
* `payable` 函数数量
* `public` 函数数量
* 代码行数(复杂度的代理)
让我们构建一个特征提取器:
```
import re
import hashlib
from pathlib import Path
RISKY_KEYWORDS = [
"delegatecall",
"call.value",
"tx.origin",
"selfdestruct",
"block.timestamp",
]
def extract_features_from_text(source: str):
lines = source.splitlines()
n_lines = len(lines)
n_payable = len(re.findall(r"\bpayable\b", source))
n_public = len(re.findall(r"\bpublic\b", source))
features = {
"n_lines": n_lines,
"n_payable": n_payable,
"n_public": n_public,
}
for kw in RISKY_KEYWORDS:
features[f"has_{kw.replace('.', '_')}"] = 1 if kw in source else 0
return features
```
这已经可以检测到:
* 大型合约
* 侧重于支付的合约
* `delegatecall` → 代理或利用
* `tx.origin` → 错误的访问控制
* 价值转移模式
你现在正在执行与许多形式化工具类似的早期静态分析。
## 第三步:将特征转化为风险评分
在立即应用机器学习之前,我们从一个启发式评分引擎开始,模拟人类审计师的思维方式。
示例评分逻辑:
```
def compute_risk(features):
score = 0
if features["has_delegatecall"]:
score += 50
if features["has_tx_origin"]:
score += 40
if features["has_call_value"]:
score += 30
if features["n_payable"] > 3:
score += 25
elif features["n_payable"] > 0:
score += 5
if features["n_lines"] > 300:
score += 15
elif features["n_lines"] > 100:
score += 5
score = min(100, score)
if score <= 20:
level = "Low"
elif score <= 60:
level = "Medium"
else:
level = "High"
return score, level
```
这使得 Python 能够:
* 识别高度危险的合约
* 将合约分类到风险等级中
* 在不运行代码的情况下检测不安全代码
## 第四步:通过源码哈希实现可追溯性
每个合约都会进行哈希处理:
```
def hash_source(source):
return hashlib.sha256(source.encode()).hexdigest()
```
这为每个 Solidity 文件提供了一个 **唯一指纹**。
它允许:
* 缓存分析结果
* 跟踪版本
* 将风险结果链接到特定源码
* 在数据库或区块链中存储评估结果
## 第五步:运行分析器(命令行界面)
一个最终的 CLI 将所有部分组合在一起:
```
python src/cli.py --file data/examples/high_risk_delegatecall.sol
```
产生:
```
{
"source_hash": "…",
"features": { … },
"risk_score": 90,
"risk_level": "High"
}
```
这是一个完整的静态分析流水线。
## 第六步:测试真实漏洞合约(有趣的部分)
向 Python 输入各种 Solidity 代码片段并观察信号反应。
## 委托调用漏洞
```
target.delegatecall(data);
```
Python 标记:
```
has_delegatecall = 1
```
风险评分飙升。
## 访问控制错误
```
require(tx.origin == owner);
```
Python 标记:
```
has_tx_origin = 1
```
立即判定为中/高风险。
## 重入攻击模式
```
(bool ok, ) = msg.sender.call{value: amount}("");
```
正则表达式尚未能捕获这一点,因此我们扩展了模式:
```
if "call{value:" in source.replace(" ", ""):
features["has_reentrancy_pattern"] = 1
```
现在 Python 可以检测到重入攻击指纹。
## 第七步:迈向机器学习
一旦提取出特征,下一步显而易见:
### 训练模型。
1. 构建数据集:
* 将每个 `.sol` 文件标记为低/中/高风险
* 程序化提取特征
2. 训练:
`RandomForestClassifier().fit(X, y)`
3. 自动预测风险。
这将 Python 转变为一个轻量级的 AI 审计器。
## 第八步:迈向完整的 AST 解析(进阶)
正则表达式 = 快速且简单
AST = 准确且强大
未来升级:
* 使用 **Slither** 程序化调用
* 使用 **solidity-parser-antlr** 解析 Python
* 提取:
* 函数图
* 调用图
* 状态变更模式
* 受保护/未受保护的 setter
* 基于角色的访问控制检测
这就是专业审计工具内部的工作方式。
## 最后的思考
教 Python “阅读” Solidity 比你想象的更容易,但比它看起来更强大。只需:
* 原始文本
* 一些正则表达式
* 简单的启发式
* 恰当的特征工程
你就可以构建一个能够在部署前标记危险模式的静态分析器。
这个项目是以下领域的完美基础:
* 区块链机器学习研究
* 教育安全工具
* 自动化 CI 安全流水线
* 智能合约 QA 系统
* 未来的开源安全工具
Python 不仅仅是在读取 Solidity,
**它正在学会理解它。**
标签:Caido项目解析, Python, SEO, Solidity, Streamlit, 云安全监控, 代码特征, 代码解析, 区块链代码分析, 区块链安全, 可解释性, 启发式分析, 委托调用, 安全专业人员, 安全信号, 密钥泄露防护, 对称加密, 无后门, 智能合约安全, 智能合约漏洞, 机器学习安全, 特征工程, 研究工具包, 自动化审计, 访问控制, 逆向工具, 重入攻击, 静态分析, 风险模式