Saya ingin menggunakan Raspberry Pi dalam produk komersial, tetapi saya ingin mencegah rekayasa balik perangkat lunak pada perangkat. Perangkat lunak yang dimaksud akan ditulis dalam Ruby. Saya berasumsi bahwa pengguna akhir memiliki akses fisik ke kartu SD dan cukup pintar untuk mendapatkan akses root ke Pi.
Seperti yang saya lihat, opsi dapat mencakup:
- Enkripsi bagian (atau semua) kartu SD
- Mengaburkan kode Ruby atau kompilasi ke bytecode (JRuby atau Rubinius)
Enkripsi akan menjadi solusi terbaik, tapi saya tidak bisa memikirkan cara untuk mendekripsi tanpa meminta kunci dari pengguna. Kebingungan kode jelas mungkin, tetapi kurang aman di pikiran saya.
Apakah mungkin untuk mengenkripsi sebagian kartu SD tanpa meminta kunci kepada pengguna untuk mendekripsi? Atau adakah cara yang lebih baik untuk memastikan kode hanya dapat diakses pada perangkat yang diinginkan?
sumber
Jawaban:
Tentu saja mungkin untuk mendekripsi file / wadah terenkripsi / dll. tanpa meminta kata sandi. Cukup untuk menyimpan kata sandi (terenkripsi) pada kartu SD dan menggunakannya untuk mendekripsi data Anda. Misalnya,
openssl
demo mudah dapat berupa:Enkripsi akan dilakukan saat menginstal perangkat lunak pada Pi, dan dekripsi akan dilakukan pada saat runtime, mungkin dalam RAM. Misalnya, kata sandi dapat berupa kombinasi beberapa nomor urut pseudorandom (diketahui oleh Anda) dan nomor seri Pi tertentu yang diperoleh dari a
cat /proc/cpuinfo
. Maka Anda harus menemukan lokasi tersembunyi yang sesuai untuk menyimpan nomor pseudorandom ini yaitu untuk semua maksud dan tujuan " kata sandi " dan dengan demikian titik lemah dari keseluruhan mekanisme enkripsi. Misalnya sektor cadangan pada SD akan menjadi pilihan umum, tetapi Anda bahkan dapat menanamkannya ke dalam salah satu executable Anda.Bagaimanapun, pilihan terbaik Anda adalah mengenkripsi dan mengkompilasi perangkat lunak Anda, untuk menambahkan berbagai lapisan kebingungan ke perangkat lunak Anda.
Akhirnya, jika perangkat lunak Anda memerlukan koneksi internet, Anda bahkan dapat membuat Pi meminta kata sandi setiap waktu. Anda masih harus menyembunyikan kata sandi di dalam koneksi, Anda juga harus menggunakan
https
dan Anda harus melindungi terhadap serangan balasan, menggunakan waktu saat inisalt
untuk enkripsi.Anda memiliki banyak opsi (murah) untuk membuat perangkat lunak Anda aman. Tetapi Anda harus tahu bahwa jika perangkat lunak Anda mencapai ambang popularitas yang sudah ditentukan dengan baik, pasti akan retak, bahkan jika Anda menginvestasikan sejumlah besar uang dalam perlindungannya.
sumber
Secara praktis, jika kode dan kunci berada pada mesin kartu SD, mereka akan dapat melakukan kompilasi, mereka akan dapat menemukan kunci dan mereka akan dapat mengekstraksi data sensitif.
Ini seperti mengenkripsi film, DVD harus memasukkan semua informasi yang diperlukan untuk mendekripsi film sehingga dapat ditampilkan kepada penonton, sehingga semua mekanisme perlindungan salinan film pada akhirnya akan hancur.
Yang terbaik yang dapat Anda lakukan adalah mengubah ekonomi rekayasa balik produk Anda.
Apakah enkripsi dan / atau kebingungan layak?
Sekarang kami telah menetapkan bahwa tidak ada cara untuk sepenuhnya melindungi diri Anda sendiri, pertanyaan menjadi
Jika ini menghasilkan keharusan ekonomi yang signifikan untuk melindungi algoritme / data Anda, maka Anda harus melakukannya. Misalnya jika nilai layanan dan biaya untuk pelanggan sama-sama tinggi, tetapi biaya rekayasa balik kode Anda jauh lebih rendah daripada biaya pengembangannya sendiri, maka orang dapat mencobanya.
Jadi, ini mengarah ke pertanyaan Anda
Kebingungan
Opsi yang Anda sarankan, mengaburkan kode, mengacaukan ekonomi di atas - itu mencoba untuk secara signifikan meningkatkan biaya kepada mereka (5 di atas) tanpa meningkatkan biaya kepada Anda (6) sangat banyak. Masalahnya adalah bahwa seperti halnya dengan enkripsi DVD itu pasti akan gagal dan jika ada cukup perbedaan antara 3, 4 dan 5 maka pada akhirnya seseorang akan melakukannya.
Opsi lain mungkin berupa Steganografi , yang memungkinkan Anda mengidentifikasi siapa yang mendekripsi kode Anda dan mulai mendistribusikannya. Misalnya, jika Anda memiliki 100 nilai float yang berbeda sebagai bagian dari data Anda, dan kesalahan 1 bit di LSB dari masing-masing nilai tersebut tidak akan menyebabkan masalah dengan aplikasi Anda, menyandikan pengidentifikasi unik (untuk setiap pelanggan) ke dalam bit tersebut . Masalahnya adalah, jika seseorang memiliki akses ke beberapa salinan data aplikasi Anda, akan jelas bahwa itu berbeda, membuatnya lebih mudah untuk mengidentifikasi pesan tersembunyi.
Perlindungan
Satu-satunya pilihan yang benar-benar aman adalah memberikan bagian penting dari perangkat lunak Anda sebagai layanan , daripada memasukkannya ke dalam aplikasi Anda.
Secara konseptual, aplikasi Anda akan mengumpulkan semua data yang diperlukan untuk menjalankan algoritme Anda, mengemasnya sebagai permintaan ke server (dikendalikan oleh Anda) di cloud , layanan Anda kemudian akan menghitung hasil Anda dan meneruskannya kembali ke klien, yang akan menampilkannya.
Ini menjaga semua hak milik Anda, data rahasia dan algoritma dalam domain yang Anda kontrol sepenuhnya, dan menghilangkan segala kemungkinan klien mengekstraksi.
Kelemahan yang jelas adalah bahwa klien terikat pada penyediaan layanan Anda, berada di tangan server Anda dan koneksi internet mereka. Di sisi positifnya, mereka selalu terbarui dengan perbaikan bug. Sayangnya banyak orang menolak SaaS karena alasan-alasan ini.
Ini akan menjadi langkah besar yang harus diambil, dan bisa memiliki biaya besar 6 di atas, tetapi merupakan satu-satunya cara saya bisa melihat untuk menjaga algoritma dan data Anda sepenuhnya aman .
sumber
Baru-baru ini saya menemukan solusi yang sangat elegan untuk masalah yang tidak terpecahkan ini. Itu terinspirasi oleh komik xkcd ini:
Jadi solusinya disebut lem super . Jika satu kartu SD superglue ke PI akan hampir mustahil untuk mengekstrak kartu tanpa merusaknya.
Anda bahkan dapat menggunakan disk SSD eksternal, dienkripsi dengan kata sandi yang disimpan di SD dan merasa aman!
sumber
dd
) darinya, dan menggunakannya sesuai!Kompilasi dengan bytecode akan menjadi penolak terbaik. Sedangkan untuk enkripsi, perangkat lunak dapat disimpan dalam volume TrueCrypt, tetapi hanya jika pengguna tidak mendapatkan akses root; tidak ada cara untuk menyimpan kata sandi dengan aman karena memori / disk dapat dibuang kapan saja untuk diperiksa. Bahkan bantuan perangkat yang aman (kartu pintar) tidak akan berbuat banyak, jika perangkat lunak berjalan di mana pengguna memiliki sejumlah besar utilitas linux. Sejauh yang saya tahu boot aman bukan merupakan pilihan pada R-Pi yang akan mencegah pengguna bermain-main di dalam OS.
sumber
Jika Anda ingin membuat aplikasi Komersial yang benar, maka Pi, karena dalam bentuk pengguna akhir tidak ada gunanya bagi Anda!
Anda harus mendesain PCB Anda sendiri, menggunakan prosesor yang ada di Pi misalnya dan menanamkan memori flash ke PCB.
TIPS
Akhir hari. Raspberry Pi dimaksudkan untuk tujuan Pendidikan bagi anak-anak untuk belajar cara menggunakan Linux dan menulis beberapa program.
Itu tidak cocok untuk penggunaan komersial profil tinggi. Anda perlu membuat perangkat Anda sendiri dan membuat sistem perlindungan Anda sendiri. Karena jika hanya Anda dan tidak ada orang lain yang tahu bagaimana Anda melindungi informasi kepantasan Anda maka peluang seseorang meretasnya menggunakan eksploit atau brute yang diketahui .. adalah 0,001%
ALTERNATIF
sumber
Salah satu solusinya adalah dengan menggunakan alamat MAC dari RaspberryPi yang hampir unik untuk Pi yang diberikan. Verifikasi alamat ini di dalam kode Anda dan berikan versi yang dikompilasi. Ini akan membuat reverse engineering menjadi sulit.
Untuk orang-orang yang secara buta menyalin kartu SD ke yang baru, itu tidak akan bekerja untuk mereka di Pi lain. Ini akan membuat sebagian besar orang mencuri perangkat lunak Anda. Lainnya yang cukup pintar untuk memecahkan ini mungkin cukup pintar untuk membuat ulang perangkat lunak, jumlah mereka tidak banyak dan saya pikir mereka tidak akan merusak penjualan Anda.
sumber
Anda dapat menggunakan solusi berbasis piggy-back: Software Serial Protection untuk Raspberry Pi
sumber
Mengapa tidak menambahkan flash berbasis SPI ke papan operator Anda dan menyimpan kode Anda di atasnya? Saya mempertimbangkan opsi ini untuk produk saya sendiri. Jika SD rusak, saya ingin pengguna akhir dapat menulis yang baru, yang mencakup raspbian khusus, dan kode untuk memasang flash SPI dan menjalankan executable.
Pilihan lain adalah menyimpan kunci enkripsi di RTC Anda. Sebagian besar chip RTC memiliki beberapa penyimpanan dan mereka dapat diprogram dengan kunci yang memungkinkan untuk membuka dan memasang executable dari SD atau dari flash SPI.
sumber
Saya percaya bahwa semua CPU yang digunakan dalam kisaran Raspberry Pi mendukung boot aman sendiri. Saya percaya ini membutuhkan 12 volt untuk merefash 4,8,16,32 atau 64K flash internal atau EEPROM yang tidak dimiliki oleh pi itu sendiri. Dari mereka, Anda dapat mengatur Trustzone dengan kode Anda sehingga semua hal yang baik tidak dapat dilihat. Saya juga mengerti bahwa kedua bentuk RAM statis hanya stabil untuk sejumlah penulisan ulang. Langkah pertama saya adalah memiliki CPU cadangan dan mencoba mem-flash memori boot aman ini selama beberapa jam atau hari. Akhirnya, semua bit diperbaiki sehingga tidak ada orang lain yang dapat memodifikasi kode Anda dan tergantung pada produk yang sebenarnya, Anda dapat secara berkala meminta identifikasi 2 faktor (seperti bank) sehingga produk mengeluarkan kode & kode reaktivasi dikirim ke alamat email. Jika Anda mod pi sedikit, Saya percaya bahwa ARM juga memiliki CPUID sehingga ada sejumlah tingkat keamanan yang bisa Anda gunakan. Maksud saya, Anda juga bisa menawarkan SMS ke nomor tertentu. Banyak cara.
sumber