Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
12 views42 pages

Demystifying Fuzzing

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
12 views42 pages

Demystifying Fuzzing

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 42

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

You might also like