
EF/CF - अत्यंत तेज़ स्मार्ट कॉन्ट्रैक्ट फ़ज़िंग
EF/CF स्मार्ट कॉन्ट्रैक्ट फ़ज़िंग के लिए एक नया दृष्टिकोण है: नए कस्टम-निर्मित फ़ज़र के बजाय, यह C/C++ कोड के मौजूदा फ़ज़िंग इंफ्रास्ट्रक्चर को स्मार्ट कॉन्ट्रैक्ट्स पर पुनः उपयोग करता है। वर्तमान में, AFL++ मुख्य रूप से समर्थित फ़ज़र है, हालांकि libfuzzer और honggfuzz के लिए कुछ बहुत ही प्रारंभिक समर्थन भी है।
मौजूदा फ़ज़िंग इंफ्रास्ट्रक्चर का उपयोग क्यों करें?
रास्ते में हमें किन समस्याओं का सामना करना पड़ता है?
./src/ethmutator/./src/evm2cpp/यह रिपॉजिटरी EF/CF प्रोजेक्ट का प्राथमिक प्रवेश बिंदु है। इसमें सभी
प्रासंगिक कोड ./src/ में उप-प्रोजेक्ट्स के रूप में और कई सुविधाजनक स्क्रिप्ट्स
शामिल हैं: स्थापना के लिए, फ़ज़िंग अभियान शुरू करने के लिए, और विभिन्न डेटासेट जो
फ़ज़र का परीक्षण करने (और अन्य उपकरणों से तुलना करने) के लिए हैं।
./src/ - EF/CF को बनाने और चलाने के लिए आवश्यक सभी स्रोत शामिल हैं; पुनरुत्पादन के लिए
सभी प्रत्यक्ष निर्भरताएँ git सबमॉड्यूल्स के रूप में जोड़ी गई हैं।./data/ - मूल्यांकन के दौरान उपयोग किए गए डेटासेट शामिल हैं./scripts - प्रयोग, स्थापना आदि चलाने के लिए स्क्रिप्ट शामिल हैं./docker - कंटेनर-आधारित वर्कफ़्लो के लिए Dockerfile
./docker/tools/ में उन उपकरणों के लिए dockerfiles हैं जिनके विरुद्ध हमने EF/CF का मूल्यांकन किया।
हमने अपने पेपर में मूल्यांकित संस्करणों को dockerfiles में स्थिर करने की
पूरी कोशिश की।./EXPERIMENTS.md - एक मार्गदर्शिका शामिल है जो
हमारे पेपर के प्रयोगों को पुनः प्रस्तुत करने के लिए।./examples - EF/CF द्वारा उत्पादित उदाहरण आउटपुट शामिल हैंहम EF/CF की वास्तुकला, कार्यान्वयन का वर्णन करते हैं, और अपने मूल्यांकन परिणामों का सारांश अपने पेपर में प्रस्तुत करते हैं: arxiv.org प्रीप्रिंट
शैक्षणिक कार्य में EF/CF का उल्लेख करते समय कृपया निम्नलिखित bibtex प्रविष्टि का उपयोग करें उद्धरण के लिए:```bibtex @InProceedings{efcf2023, author = "Michael Rodler and David Paaßen and Wenting Li and Lukas Bernhard and Thorsten Holz and Ghassan Karame and Lucas Davi", title = "EF/CF: High Performance Smart Contract Fuzzing for Exploit Generation", booktitle = "{IEEE} European Symposium on Security and Privacy ({EuroS&P})", publisher = "{IEEE}", year = "2023", }
## Quickstart
अनुशंसित तरीका EF/CF को एक इंटरैक्टिव डॉकर कंटेनर के रूप में चलाना है।
1. शेल के साथ कंटेनर में प्रवेश करें ```
docker run --rm -it ghcr.io/uni-due-syssec/efcf-framework
या क्लोन की गई रिपॉजिटरी से कंटेनर बनाएँ ``` make gitmodules # to fetch the git submodules make container-enter
1. एक solidity कॉन्ट्रैक्ट को संकलित करें और फिर पहले क्रैश/बग का पता चलने तक
फ़ज़ करें: ```
efcfuzz --until-crash --out ./baby_bank_results/ --source ./data/examples/baby_bank.sol
गिट नहीं है? अगर आप tarball/docker release का उपयोग करते हैं, तो इसे अनदेखा करें।
पहले से क्लोन किए गए repositories में नवीनतम submodule commits प्राप्त करने के लिए git submodule update --init चलाएँ।
इसे ./src/eEVM में भी चलाना सुनिश्चित करें।```
git submodule update --init; cd src/eEVM/; git submodule update --init; cd ../../
*चेतावनी:* `git clone --recursive $repo` चलाना या `git sumbodule (update|init)` को `--recursive` तर्क देना git को AFL++ रिपॉजिटरी के सबमॉड्यूल्स में recursively जाने के लिए बाध्य करेगा, जो इस प्रोजेक्ट के लिए आवश्यक नहीं हैं। इसलिए कुछ स्थान बचाने के लिए recursive सबमॉड्यूल चेकआउट से बचना बेहतर है।
### कंटेनर
हम कंटेनर-आधारित वर्कफ़्लो के लिए निम्नलिखित सुविधाजनक make टारगेट प्रदान करते हैं:```sh
make container-build # build default efcf container
make container-enter # enter default efcf container in current working dir
यदि आप एक स्वच्छ बिल्ड सुनिश्चित करना चाहते हैं, तो आप निम्न कमांड का उपयोग कर सकते हैं```sh make container-build CLEAN_CHECKOUT=1
वैकल्पिक रूप से कंटेनर को निम्नलिखित डॉकर कमांड के साथ बनाया जा सकता है:```sh
docker build \
-f docker/ubuntu.Dockerfile \
-t efcf:latest \
.
ध्यान दें कि Archlinux और Fedora पर आधारित Dockerfile भी है। उन्हें भी काम करना चाहिए लेकिन उनका परीक्षण उतना अच्छी तरह से नहीं किया गया है।
docker image को मैन्युअल रूप से वितरित करने के लिए (जैसे, यदि कुछ स्थानीय परिवर्तन शामिल हैं), उपयोग करें:``` make container-release docker load -i ./efcf*.tar
हम लॉन्च करने के लिए निम्नलिखित docker विकल्पों की अनुशंसा करते हैं:
* `--security-opt seccomp=unconfined` - बेहतर fuzzing प्रदर्शन के लिए
* `--net=host` - स्थानीय ethereum नोड तक आसान पहुँच के लिए
* `--tmpfs "/tmp/efcf/":exec,size=6g` - यदि संभव हो तो EF/CF की अस्थायी फ़ाइलें ramdisk पर रखें (कम डिस्क घिसाव)
* `--privileged` - `afl-system-config` या `efcfuzz --configure-system` चलाने के लिए
* `-v` - EF/CF के आउटपुट डेटा को स्थायी रखने के लिए
### VM / बेयर-मेटल
VM या बेयर-मेटल-आधारित वर्कफ़्लो के लिए:```sh
make system-install # install efcf to current system (requires root or sudo rights)
ध्यान दें कि बहुत सारी स्क्रिप्टें वैसे भी सापेक्ष निर्देशिका लेआउट पर काम करती हैं, इसलिए
यह ज़्यादातर निर्भरताएँ (dependencies) और कुछ उपकरण (tools) इंस्टॉल करता है जो आपके
PATH में रखने के लिए उपयोगी हैं। हमने EF/CF को निम्नलिखित Linux वितरणों पर परीक्षण किया है:
(वितरण (Distro) ज़्यादा मायने नहीं रखता, हमने LLVM 13 और 14 का परीक्षण किया है और 14 को
पसंदीदा विकल्प माना है। LLVM 11 या 12 भी शायद अभी भी काम करें, लेकिन हमेशा की तरह - जितना नया उतना बेहतर।
महत्वपूर्ण बात यह है कि एक ऐसा LLVM होना चाहिए जो AFL++ के हमारे फोर्क (fork) के साथ संगत हो।)
हमने EF/CF का Mac OS पर मूल रूप से (natively) परीक्षण नहीं किया है। संभवतः चीज़ें काम नहीं करेंगी (जैसे, Mac OS पर afl-clang-lto काम नहीं करता प्रतीत होता है)। सबसे अच्छा विकल्प docker का उपयोग करना है।```sh
make gitmodules
docker pull ubuntu:jammy --platform linux/amd64
docker build -t efcf:latest -f docker/ubuntu.Dockerfile --platform linux/amd64 .
docker run --tmpfs "/tmp/efcf/":exec,size=8g --platform linux/amd64 --rm -it -v $(pwd):$(pwd) -w $(pwd) efcf:latest
हमने docker desktop v4.21.1 का उपयोग करके परीक्षण किया और बुनियादी EF/CF उपयोग काम करता है। हालाँकि, निम्नलिखित पर विचार करें:
* यदि आपको बिल्ड के दौरान segfaults दिखें: Mac OS पर docker द्वारा उपयोग की जाने वाली VM की मेमोरी सीमा बढ़ाने का प्रयास करें।
* docker में rosetta का उपयोग करके acceleration सक्षम करने का प्रयास करें - उम्मीद है कि यह थोड़ा तेज़ होगा।
### विकास सेटअप