SWC-127/函数类型变量任意跳转
Solidity支持函数类型地变量。也就是说,一个函数类型的变量可以赋值未具有匹配签名的函数的引用。 保存到此类变量的函数可以像常规函数一样调用。
当用户具有任意更改函数类型变量并执行随机代码指令的能力时,就会出现问题。由于Solidity 不支持指针算术,因此无法将此类变量更改为任意值。但是,如果开发人员使用 汇编指令(例如mstore或赋值运算符),则在最坏的情况下,攻击者能够将函数类型变量指向任何代码指令,从而违反了所需的验证和所需的状态更改。
CWE漏洞分类
整改方案
应尽可能少使用汇编代码。开发人员不应允许用户为函数类型变量分配任意值。
参考文献
示例合约
FunctionTypes.sol
/*
* @source: https://gist.github.com/wadeAlexC/7a18de852693b3f890560ab6a211a2b8
* @author: Alexander Wade
*/
pragma solidity ^0.4.25;
contract FunctionTypes {
constructor() public payable { require(msg.value != 0); }
function withdraw() private {
require(msg.value == 0, 'dont send funds!');
address(msg.sender).transfer(address(this).balance);
}
function frwd() internal
{ withdraw(); }
struct Func { function () internal f; }
function breakIt() public payable {
require(msg.value != 0, 'send funds!');
Func memory func;
func.f = frwd;
assembly { mstore(func, add(mload(func), callvalue)) }
func.f();
}
}
FunctionTypes.yaml
description: Arbitrary jump with function type variable
issues:
- id: SWC-127
count: 1
locations:
- bytecode_offsets:
'0x10262f9b836c8ce4a7c2807a00b08e278094414ceeb2b5cbf4365c7ced0fd2f9': [264]
line_numbers:
FunctionTypes.sol: [26]