Repositori ini mengimplementasikan alat untuk memverifikasi bahwa tambalan dijamin untuk melacak kesetaraan (Pate).
Tujuannya adalah untuk membuktikan bahwa tambalan keamanan yang diterapkan pada binari hanya menghilangkan perilaku buruk, atau mengkarakterisasi mereka secara tepat untuk pengembang tambalan. Verifier mendukung biner PowerPC dan AARCH32 (saat ini membutuhkan binari ELF yang terkait secara statis).
Cara tercepat untuk memulai adalah membangun gambar Docker dan menggunakan alat melalui Docker. Untuk instruksi bangunan yang lebih mendalam, lihat bagian pengembangan, di bawah ini.
Pertama, bangun gambar Docker dengan perintah:
Docker Build --Platform Linux/AMD64. -t pate
Selanjutnya, jalankan verifier pada contoh:
Docker run --rm -it --Platform linux/amd64 -v "$ (pwd)"/tes/integrasi/paket/exe:/target pate --original/target/packet.exe ---Packet/target/packet.patched.exe -s parse_packet
Verifier menerima argumen baris perintah berikut:
-H,-Bantuan menunjukkan teks bantuan ini
-o,-Biner asli Exe asli
-p,-biner yang ditambal exe yang ditambal
-B,-BlockInfo FileName Block Information Informasi yang Berhubungan
-s,-startsymbol arg mulai analisis dari fungsi dengan simbol ini
-d,-nodiscovery tidak secara dinamis menemukan pasangan fungsi berdasarkan
panggilan.
--solver arg pemecah SMT untuk digunakan untuk menyelesaikan verifikasi
kondisi. Salah satu CVC4, yices, atau z3
(default: yices)
--Goal-time out arg timeout untuk memverifikasi tujuan individu dalam hitungan detik
(Default: 300)
--waktu-heuristik Arg ARG timeout untuk memverifikasi tujuan heuristik dalam hitungan detik
(Default: 10)
--original-anvill-hints arg
Parsing spesifikasi anvill untuk penemuan kode
Petunjuk
--Patched-anvill-hints arg
Parsing spesifikasi anvill untuk penemuan kode
Petunjuk
--Roriginal-Probabilistik-Hints Arg
Parse file json yang berisi fungsi probabilistik
Petunjuk Nama/Alamat
-Patched-probabilistic-hints arg
Parse file json yang berisi fungsi probabilistik
Petunjuk Nama/Alamat
--original-csv-function-hints arg
Parse file CSV yang berisi nama/alamat fungsi
Petunjuk
--Patched-CSV-Function-hints arg
Parse file CSV yang berisi nama/alamat fungsi
Petunjuk
--original-bsi-hints arg parse file json yang berisi nama fungsi/alamat
Petunjuk
--Patched-bsi-hints arg parse file json yang berisi nama fungsi/alamat
Petunjuk
---no-dwarf-hint tidak mengekstrak metadata dari informasi kerdil di
binari
-V,-verbosity arg verbositas output logging (default: info)
-Save-Macaw-CFGS Dir Simpan Macaw CFGS ke direktori yang disediakan
file-solver-interaksi file
Simpan interaksi dengan pemecah SMT selama simbolik
eksekusi ke file ini
-file-summary-json
File untuk menyimpan hasil bukti yang menarik di JSON
format
-Log-File File file untuk menyimpan log debug ke
-e,-mode penanganan kesalahan errorMode arg verifier
(Default: ThrowonAnyFailure)
-r,-rescopeMode arg mode penanganan kembali kegagalan rescoping failure
(Default: ThrowoneQrescopeFailure)
-SKIP-NAMA-FUNGSI Lewati Analisis Fungsi Tanpa Simbol
-Skip-Divergent-Control-Flow
<Sprecated>
--Target-equiv-regs arg menghitung kondisi kesetaraan yang cukup
menetapkan kesetaraan pada register yang diberikan setelah
Toplevel Entrypoint kembali. <Sprecated>
-ignore-segmen arg lewati segmen (0-indeks) Saat memuat elf
--json-Toplevel Run TopLevel dalam mode output JSON (mode interaktif
hanya)
--Baca-Segmen-Segmen Arg Segmen Mark Sebagai Baca-Hanya (0-Indeks) Saat Memuat
PERI
--Script FileName Simpan Macaw CFGS ke direktori yang disediakan
--sasume-stack-scope Tambahkan asumsi tambahan tentang kerumunan bingkai tumpukan
Selama panggilan fungsi (tidak aman)
--Ignore-warnings arg tidak meningkatkan jenis peringatan yang diberikan
-Selalu-klasifikasi-kembali selalu menyelesaikan kegagalan classifier dengan mengasumsikan
fungsi kembali, jika memungkinkan.
Bagian Mulai Cepat menggambarkan perintah untuk menjalankan verifier pada case uji menggunakan wadah Docker. Bagian ini akan mencakup beberapa perintah yang berguna untuk skenario lain.
Jika Anda memiliki file tar dari gambar Docker dari verifier, Anda dapat menginstalnya menggunakan perintah:
Load Docker -i /path/to/pate.tar
Untuk menjalankan verifier melalui Docker setelah ini:
Docker Run --RM -It --Platform Linux/AMD64 Pate --help
Untuk memanfaatkan verifier dengan Docker, penting untuk memetakan direktori pada sistem file lokal Anda ke dalam wadah Docker untuk dapat menyimpan file output. Dengan asumsi bahwa biner asli dan tambalan Anda masing -masing adalah original.exe dan patched.exe : masing -masing:
mkdir verifierdata
CP Original.exe Patched.exe VerifierData/
Docker Run --RM -It --Platform Linux/AMD64
-v `pwd`/verifierdata`:/verifierdata pate
--original /verifierdata/original.exe
--Patched /verifiERData/Patched.exe
--Proof-Summary-Json /VerifiFierData/Report.json
--Gog-File /VerifiERData/Pate.Log
--Save-Macaw-CFGS /VerifierData /CFGS
Perintah ini akan menjalankan verifier pada dua binari dan mengantar Anda ke loop baca-eval-print, di mana Anda dapat secara interaktif menjelajahi output verifier.
Secara default, verifier mulai memverifikasi dari titik masuk program formal. Ini seringkali tidak terlalu berguna (dan bisa bermasalah untuk biner kompleks dengan _start besar yang menyebabkan masalah untuk penemuan kode kami). Selain itu, untuk perubahan dengan ruang lingkup dampak yang diketahui (atau setidaknya yang diharapkan), menganalisis hanya fungsi yang terpengaruh secara signifikan lebih cepat. Untuk menentukan titik masuk analisis, melewati opsi -s <function_symbol> akan memulai analisis dari fungsi yang sesuai dengan simbol yang diberikan. Perhatikan bahwa ini membutuhkan simbol fungsi yang akan disediakan untuk binari (baik sebagai simbol debug tertanam atau secara terpisah dalam salah satu format petunjuk).
Meskipun tidak sehat, kadang-kadang berguna untuk memperlakukan panggilan fungsi sebagai no-op. Misalnya, mengabaikan fungsi besar yang tidak berubah dan tidak mungkin memiliki efek pada kebenaran (misalnya, fungsi kriptografi besar dari perpustakaan tepercaya) dapat secara signifikan meningkatkan kinerja. Untuk menggunakan fitur ini, berikan file konfigurasi ke verifier menggunakan opsi --blockinfo , memastikan bahwa file konfigurasi mencakup arahan berikut:
abaikan-fungsi-original = [<spulht>, ...] abaikan fungsi-ditandai = [<dressule>, ...]
di mana masing -masing daftar adalah daftar alamat fungsi untuk diabaikan. Sementara kedua daftar ditentukan secara terpisah, mereka hampir pasti "selaras" antara dua binari (yaitu, mengabaikan fungsi dalam biner asli mungkin berarti bahwa fungsi yang sesuai dalam biner yang ditambal juga perlu diabaikan).
Verifier mendapat manfaat dari metadata kerdil dalam dua cara:
Untuk menyuntikkan metadata kerdil ke dalam biner tanpa itu (misalnya, binari yang dilucuti), kami sarankan menggunakan alat kurcaci. Sebagai contoh menggunakan dwarf-writer melalui citra Docker dengan asumsi keberadaan target ( target-binary.exe ) dan metadata dalam format Anvill JSON ( target-binary.exe.json ):
Load Docker -i Dwarf-Writer-docker.tar
mkdir dwarfwriterData
CP Target-Binary.exe Target-Binary.exe.json DwarfwriterData/
Docker run --rm -it -v `pwd`/dwarfwriterData:/dwarfwriterData kurcaci
--Anvill /dwarfwriterData/target-binary.exe.json
/DwarfwriterData/target-binary.exe
/DwarfwriterData/target-binary-darf.exe
Ini akan menghasilkan versi biner yang dianotasi dengan metadata kerdil di DwarfWriterData/target-binary-dwarf.exe .
Jika Anda memiliki alat llvm-dwarfdump , Anda dapat menggunakannya untuk memeriksa metadata kerdil yang dihasilkan. Verifier pate akan secara otomatis memanfaatkan petunjuk metadata kerdil kecuali diarahkan untuk mengabaikannya.
Verifier mengambil dua binari sebagai input: biner asli dan biner yang ditambal. Asumsinya adalah bahwa beberapa tambalan berorientasi keamanan telah diterapkan pada biner asli yang sebagian besar menjaga perilakunya, tetapi dapat memperbaiki beberapa perilaku yang tidak diinginkan. Verifier kemudian berusaha untuk membuktikan bahwa kedua binari menunjukkan perilaku yang dapat diamati yang sama; Jika tidak bisa, itu menghasilkan ringkasan diferensial yang menggambarkan kondisi di mana biner yang ditambal menunjukkan perilaku yang berbeda dari aslinya. Hal ini memungkinkan pengembang patch untuk memahami dampak tambalan mereka pada semantik program dan mengevaluasi apakah dampaknya terbatas pada jalur eksekusi yang mereka maksudkan.
Verifier tidak memerlukan spesifikasi yang disediakan secara manual dari pengguna; Sebaliknya, ia memperlakukan program asli sebagai spesifikasi perilaku yang diinginkan. Pengaturan ini menjadikan Pate verifier relasional , karena menghubungkan biner yang ditambal dengan aslinya. Verifier didasarkan pada sejumlah perpustakaan yang ada untuk penemuan kode biner dan pelaksanaan program simbolis (termasuk program kode mesin). Secara kasar, verifier berfungsi oleh:
Alat Pate ditulis dalam Haskell dan membutuhkan kompiler GHC (kami menguji dengan 9.6) dan alat pembuatan komplotan untuk dikompilasi. Bangunan dari sumber dapat dicapai dengan:
git clone [email protected]: galoisinc/pate.git CD Pate Pembaruan Submodule Git --inin CP Cabal.project.dist Cabal.project Cabal Configure PKG: Pate ./pate.sh --help
Verifier membutuhkan pemecah SMT untuk tersedia di PATH . Standarnya adalah yices - z3 dan cvc4 juga dapat berfungsi tetapi tidak diuji secara teratur dengan Pate.
Materi ini didasarkan pada pekerjaan yang didukung oleh Defense Advanced Research Projects Agency (DARPA) dan Naval Information Warfare Center Pacific (NIWC Pacific) di bawah nomor kontrak N66001-20-C-4027. Setiap pendapat, temuan, dan kesimpulan atau rekomendasi yang diungkapkan dalam materi ini adalah pendapat penulis dan tidak selalu mencerminkan pandangan DARPA & NIWC Pacific.