Demystifying Fuzzing
Nat Chin
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 1
Hi! I’m Nat!
● Blockchain Security Engineer at Trail of Bits
● I figure out where things can break
● Fell down the rabbit hole in 2017
● Former smart contract developer & blockchain professor
● Author of solc-select
● Twitter: @0xicingdeath
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 2
Agenda
● Defining Invariants
● Writing properties
● Fuzzing!
● Finding fun bugs
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 3
Fuzzing
● Define assumptions meant to hold true
● Exploration of contracts with randomized arguments
● Checks dangerous contract states
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 4
What’s an invariant?
● “Invariant Testing” = “Property
Testing”
● System properties that should
always be true
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 5
Fuzzing is Easy! But It’s Also Hard!
for value in [0, 255] { ● Even with constraint smart
call function; contracts, astronomical search
if invariant is broken { space
profit ● What if the invariant is only
} broken for a single, unique
} input?
● Multiple accounts/contracts
interacting with each other?
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 6
Echidna
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 7
How do I start?
1. Identify your properties in English
2. Convert your properties to code
3. Run Echidna
4. FIND BUGS
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 8
1: Identify your Invariants
IN ENGLISH WORDS.
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 9
Invariants
● They’re everywhere!
● Token Invariants
● Mathematical invariants
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 10
Token Invariants – Total Supply
User balance never
exceeds total supply
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 11
Token Invariants – Transfer
Users cannot transfer
more than they own
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 12
Mathematical Invariant – Association
1 + 2 = 3
2 + 1 = 3
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 13
Mathematical Invariant – Identity
1 * 2 = 2
0 + x = x
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 14
Mathematical Invariant – Addition / Subtraction
x + 5 - 5 = x
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 15
2: Convert into Code
IT’S EASIER THAN IT SOUNDS.
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 16
Token Invariants – Total Supply
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 17
Mathematical Invariant – Association
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 18
Mathematical Invariant – Identity
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 19
Mathematical Invariant – Addition / Subtraction
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 20
Example - rmm-core
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 21
Liquidity Pools
● Allocate assets into the pool
● Remove assets from the pool
● Swap assets
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 22
Liquidity Pools
● Initial pool balance: x
● Deposit: 5
● Withdraw: 5 x
+5
(5)
———
x
What value do you expect the pool balance to be?
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 23
Allocate/Remove Functions
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 24
What should the test do?
1. Start with initial reserve and liquidity balance
2. Allocate funds into the system
3. Remove funds from the system
4. Balance before and after transactions should be equal
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 25
Invariant Test
Step 1
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 26
Invariant Test
Step 2
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 27
Invariant Test
Step 3
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 28
Invariant Test
Step 4
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 29
Echidna Results
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 30
Events
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 31
Event Results
Amount allocated Amount removed Delta
Token 1 6361150874 6361150873 1
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 32
Event Results
Amount allocated Amount removed Delta
Token 1 6361150874 6361150873 1
Token 2 64,302,260,917,206, 643022609152865326 1,920,041,647,503
574,294,870 47367
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 33
What does it mean?
● Adding and removing funds are not exact inverses
● Users will actually receive 1,920,041,647,503 less
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 34
Why is there a delta?
toUint128()
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 35
Why is toUint128() important?
● Converts FixedPoint 64x64 to uint128
● Truncates numbers too large
● Used in both allocation and removal functions
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 36
With that in mind….
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 37
How can it be fixed?
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 38
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 39
It can’t, but….it can be mitigated
● Defining an acceptable delta
● Round in a direction to benefit a pool
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 40
Only the tip of the iceberg…
● Access Controls
● Correct Bookkeeping
● Token balances
● Differential Fuzzing
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 41
What next?
● Talk to us!
● Go through Echidna tutorials on
building-secure-contracts
● Use Echidna on your codebase
● Join Empire Hacking
OFF THE CHAIN CON | DEMYSTIFYING FUZZING 42