Gambar: Sascha Kohlmann , CC BY-SA 2.0Ada sistem yang tidak dapat diakses oleh manusia biasa secara default. Dan para pengembang sistem semacam itu secara naif percaya bahwa mereka dilindungi dari penetrasi dan pandangan tajam dari para peneliti.
Ambil setidaknya ATM (ATM). Ada kasus yang sering terjadi ketika orang tidak dikenal datang ke ATM, menghubungkan laptop, mengambil uang dan pergi tanpa meninggalkan log di sistem. Dan cerita terbaru dengan "
cutlets " (malware yang disebut
Cutlet Maker ) mengonfirmasi bahwa tidak ada sistem yang kebal - ada yang kurang digarap.
Mulai belajar
Ada pendapat bahwa satu-satunya cara untuk mencuri uang dari ATM adalah dengan mengendarai truk sampah, mengambil kail ke ATM dan merobeknya, dan kemudian menggunakan penggiling, linggis dan mesin las gas. Tetapi ada metode lain.
Setelah pencarian singkat di
Ebay , saya punya
Dispenser S1 USB NCR USB dengan firmware di meja saya. Tujuannya adalah sebagai berikut:
- menemukan jalan pintas untuk mengenkripsi perintah yang dikirim komputer melalui USB ke dispenser itu sendiri, khususnya untuk mengeluarkan uang kertas;
- Pelajari cara menyiasati kebutuhan akses fisik ke brankas untuk otentikasi (menyentak kaset) untuk menghasilkan kunci enkripsi untuk perintah dari paragraf sebelumnya.

Firmware
Firmware adalah file
ELF untuk
prosesor NXP ColdFire (
Motorola 68040 , prosesor favorit saya), berjalan pada
VxWorks v5.5.1 .
Dalam file
ELF , dua bagian utama menarik -.
Teks dan.
Data :
- Salah satunya berisi kode yang berputar sepanjang waktu (sebut saja firmware utama) ketika dispenser terhubung ke unit sistem di bagian atas ATM.
- Yang kedua adalah kode bootloader yang dikemas dengan zlib (nama lokalnya adalah USB Secure Bootloader ), yang bertanggung jawab untuk mengunggah firmware dan meluncurkan kode utama.
Dan bagian terbaiknya adalah simbol-simbolnya tetap tidak dipotong di dalam file - ambil dan cari sesuatu yang menarik.
Perangkat internal dari firmware utama
Jika Anda membagi kode menjadi komponen utama, Anda mendapatkan skema berikut (dalam urutan pengiriman):
- Aliran yang berhubungan dengan menerima paket USB dan mendistribusikannya di antara layanan.
- Layanan adalah unit pelaksana utama, masing-masing memiliki perannya sendiri dan masing-masing memiliki tugasnya sendiri (kelas).
- Kelas - ini adalah tugas-tugas yang dapat dilakukan oleh layanan tertentu dengan bantuan pengontrol.
- Pengendali sebenarnya adalah " pekerja " ( pekerja ) yang terlibat dalam memvalidasi tugas yang dikirim kepada mereka, pelaksanaannya, serta pembentukan paket respons.

Karena ada banyak kode dalam firmware, diputuskan untuk memulai dengan mencari semua layanan yang mungkin, dan kemudian melihat di mana tugas-tugas ditransfer.
Akibatnya, layanan berikut ditemukan yang seharusnya hanya melakukan apa yang saya cari:
1)
DispTranService (Layanan Transaksi Dispenser) : bekerja dengan perintah terenkripsi, pembentukan bundel uang kertas, otentikasi. Bisa dibilang yang paling menarik ada di sini.

2)
securityService : setelah otentikasi, kunci sesi dibuat di sisi dispenser, yang, atas permintaan komputer, dikirim kepadanya dalam bentuk terenkripsi. Kunci ini akan mengenkripsi semua perintah penting - mengeluarkan, membentuk bundel uang kertas.

Selanjutnya, layanan lain menarik perhatian saya:
UsbDownloadService . Tugasnya adalah, ketika dispenser terhubung ke komputer dan versi firmware dispenser tidak cocok dengan yang tersimpan di komputer ATM, alihkan ke
bootloader untuk mengunggah firmware yang digunakan untuk menjalankan OS (terletak di folder dengan perangkat lunak vendor di komputer). Layanan ini juga tahu bagaimana memberi informasi tentang versi firmware.

Otentikasi fisik
Otentikasi fisik diimplementasikan pada tingkat tertinggi dan melindungi ATM dari hanya mengirim perintah melalui USB ke masalah tanpa otorisasi. Dalam hal ini, itu terdiri dari fakta bahwa hanya dengan brankas terbuka dengan uang Anda perlu melakukan salah satu dari yang berikut:
- lepaskan dan masukkan kaset yang lebih rendah,
- alihkan sakelar sakelar di bagian belakang rak dengan dispenser.

Tetapi semua ini diperlukan hanya jika tingkat akses diatur ke maksimum, yaitu fisik. Ada tiga di antaranya:
USB (0),
logis (1) dan
fisik (2). Dua sisanya digunakan oleh penyedia layanan dan pengembang untuk debug dan menguji firmware. Ya, yang fisik sangat direkomendasikan oleh vendor untuk digunakan secara default.
Kerentanan
Berikut ini menjelaskan kerentanan kritis (sudah diperbaiki oleh vendor pada saat penerbitan artikel), yang memungkinkan untuk menjalankan perintah dispenser, termasuk penarikan tunai, jika ada akses ke area layanan, tetapi tanpa akses ke brankas (misalnya, melalui lubang yang dibuat di panel depan ATM).
Ternyata,
UsbDownloadService menerima perintah yang tidak memerlukan enkripsi. Kedengarannya menggoda. Tapi tiba-tiba semuanya terlindungi lebih lanjut, dan nama
Secure Bootloader akan terbayar?
(Spoiler: tidak dibenarkan!)Kita harus masuk lebih dalam
Seperti yang telah disebutkan, di bagian
data. Ada kode loader yang dikemas, yang untuk waktu yang lama tidak membuat saya tertarik, dan rekan-rekan saya tidak memperhatikannya ketika mereka memeriksa firmware.

Sementara bootloader adalah sebuah misteri, pertanyaannya tetap terbuka: bagaimana perangkat lunak di komputer membanjiri firmware? Memang, dalam firmware utama, tidak ada yang semacam itu ditemukan.
Jadi,
bootloader dibongkar, dimuat ke
IDA pada offset
0x100000 - sekarang Anda dapat menyelidiki ... Hanya tidak ada karakter!
Tidak masalah: membandingkan firmware utama dengan kode bootloader, membaca lembar data controller - dan gambar tertentu mulai muncul.

Ternyata mengunggah firmware, meskipun terlihat terlindungi, sebenarnya tidak seperti itu. Yang perlu Anda ketahui adalah bagaimana mengisinya dengan benar.
Banyak usaha dan waktu dihabiskan untuk memahami proses ini secara lengkap (untuk lebih jelasnya, lihat laporan "
Blackbox sudah mati - Hidupkan Blackbox! " Di konferensi Black Hat 2018 di Las Vegas). Mengapa layak menyolder memori NVRAM, mengunggah cadangan ke sana dengan tujuan "mengikis" seluruh pengontrol ...
Terima kasih kepada kolega Alexei atas kesabaran Anda!
Hasilnya, kami mendapatkan algoritma berikut untuk mengunggah firmware ke dispenser:
1) Hasilkan sepasang kunci RSA dan isi kunci publik ke dalam pengontrol.

2) Tulis bagian
.data dan
.text berurutan dari
ELF ke alamat fisiknya dari header bagian.
3) Hitung SHA-1 dari data yang direkam, enkripsi hash dengan kunci pribadi, kirim ke controller.

4) Hitung dan kirim jumlah semua kata yang direkam dari firmware.

Setelah itu, jika semuanya dihitung dan direkam dengan sukses, firmware utama akan dimuat.
Ternyata saat menulis firmware hanya ada satu batasan: versi firmware tidak boleh lebih rendah dari yang sekarang. Tetapi tidak ada yang menghentikan kita dari mengubah versi firmware dalam datanya sendiri.
Akibatnya, firmware khusus saya dengan perbaikan
antisecurity diunggah dan berhasil diluncurkan!
Pada titik ini, kode firmware utama telah dipelajari dengan baik, perintah untuk mengeluarkan uang kertas ditemukan. Sekarang mereka dapat dikirim tanpa enkripsi, dan dispenser akan dengan senang hati mengeksekusi mereka.

Masalah
Setelah semuanya mengalami selama studi (misalnya, ATM nyata "
bricked "), hasilnya sangat menyenangkan dan mengimbangi upaya yang saya ingin mengulangi algoritma dengan vendor besar lainnya.

ATM yang paling nyata mulai berdengung dengan keras dan penuh semangat berbagi dengan kami uang kertas segar yang renyah (dalam hal ini, penjual "pembungkus permen"). Tidak ada keajaiban yang diterapkan: hanya laptop, otak, dan kabel USB.
Kesimpulan
Sekali lagi, kami yakin bahwa, dipandu oleh prinsip
keamanan melalui ketidakjelasan , tidak mungkin untuk memberikan perlindungan yang memadai. Kepatutan kode atau firmware tidak berarti sama sekali bahwa pada satu titik baik penyerang tidak akan mendapatkan akses ke sana dan tidak akan mengambil keuntungan dari kerentanan yang ditemukan. Segala sesuatu yang diperlukan untuk implementasi tujuan egois dapat diperoleh di hadapan sejumlah uang tertentu.
Pengembang harus menangani kode, dan penjaga keamanan harus melindunginya. Itulah sebabnya pendekatan yang paling produktif tampaknya adalah kerja sama dengan perusahaan keamanan informasi dengan pengalaman yang cukup dalam memastikan keamanan berbagai sistem yang akan membantu membangun perlindungan yang memadai dalam setiap kasus.
Vendor PS mengkonfirmasi kerentanan (celah juga ditemukan di model lain -
S2 ), yang dinyatakan telah diperbaiki pada perbaikan Februari 2018.
Daftar CVE:
Ucapan Terima Kasih
Sebelum saya, rekan-rekan saya -
Dima Sklyarov dan
Misha Tsvetkov - sudah bekerja pada firmware (meskipun tanpa papan dispenser). Prestasi mereka banyak membantu saya dalam penelitian ini, yang banyak terima kasih kepada mereka! Mengenai perangkat kerasnya,
Alexey Stennikov banyak membantu saya.