Bagaimana saya bisa melindungi perangkat lunak pada Pi untuk penggunaan komersial?

16

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?

Schrockwell
sumber
Saya mencari solusi serupa. Jawaban terbaik yang saya dapatkan adalah me-mount gambar (partisi) yang dienkripsi setelah boot menggunakan kondisi tertentu (mungkin panggilan ajax seperti DRM untuk memberikan kunci dekripsi dinamis, nomor seri dengan algoruthym penguncian ((SN * tanggal - 1)) - Hanya cara lain adalah dengan menggunakan kode yang dapat mengkompilasi kode Anda ke dalam binari - seperti c ++ atau .net (mono) dan berharap cracker perangkat lunak yang baik tidak akan menargetkan perangkat lunak Anda - Anda tahu penyebabnya seperti Microsoft tidak memiliki masalah ini selama ribuan tahun .. dan masih belum dipecahkan .. Semoga beruntung!
Piotr Kula

Jawaban:

8

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, openssldemo mudah dapat berupa:

openssl enc -a -e -salt -aes-256-cbc -pass pass:abc123 -in /tmp/plaintext.txt -out /tmp/ciphertext.enc

openssl enc -d -a -aes-256-cbc -pass pass:abc123 -in /tmp/ciphertext.enc

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 httpsdan Anda harus melindungi terhadap serangan balasan, menggunakan waktu saat ini saltuntuk 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.

Avio
sumber
1
Saya bisa login sebagai root dalam safe mode, membaca file kunci dan mendekripsi semua kerja kerasnya dan menjualnya ke Rusia untuk jutaan. Selamat mencoba .. tapi bukan bukti peluru. Bahkan https dapat diakali dengan pengalihan DNS dan sertifikat palsu semua dalam jaringan yang dikelola .. oops
Piotr Kula
1
@ Avi: Pertama-tama, sektor ini tidak dikenal. Harus diketahui, tidak jelas di mana itu. Tetapi karena Anda perlu mengetahuinya dengan beberapa script dekripsi / aplikasi, orang dapat menemukannya. Anda harus meletakkan kode yang akan melakukan dekripsi di suatu tempat. Di mana Anda akan meletakkannya? Dalam initramfs, beberapa partisi kartu SD atau tempat lain yang tidak terlindungi. Siapa pun dapat melihat aplikasi / skrip yang digunakan untuk mendekripsi partisi terenkripsi dan / atau mengubahnya untuk mendapatkan semacam akses sebelum dieksekusi.
Krzysztof Adamski
1
Semua metode enkripsi Anda baik-baik saja kecuali kunci disimpan pada kartu SD. Op paling mungkin ingin menjual kartu SD untuk / dengan Pi kepada pengguna akhir. Kemudian saya dapat mengambil kartu SD, brute hack itu, mengeksploitasi, safe mode ke root-baca file kunci dan menyusup ke semua perangkat komunikasi lainnya dan kode sumber. Itulah teka-teki. Saya yakin OP tahu cara mengenkripsi barang. Dia bertanya bagaimana melindungi perangkat lunaknya dari dekripsi, sementara membiarkan sistem mendekripsi secara otomatis.
Piotr Kula
1
@ Avi: Tidak, tidak juga. Tetapi karena Anda bertanya 'bagaimana?', Saya menjawabnya. Tidak tahu itu pertanyaan retoris. Anda menulis bahwa menerapkan ide Anda sudah cukup untuk mulai mendistribusikan aplikasi tetapi saya percaya OP (dan yang lain yang membaca ini) harus menyadari sisi lemah dari pendekatan ini. Yang sedang berkata, saya tidak percaya ada solusi yang jauh lebih baik untuk Raspberry Pi. Satu-satunya hal yang dapat dilakukan adalah mengaburkan lebih banyak lagi. Mungkin aplikasi OP terlalu berharga untuk mengambil risiko dan dia memutuskan untuk menggunakan sesuatu selain RPi, di mana dia dapat membuat mekanisme perlindungan yang lebih baik.
Krzysztof Adamski
1
Sementara semua jawaban di sini memberikan diskusi yang bagus tentang pengorbanan dan tantangan yang terkait dengan pertanyaan saya, saya akan menerima jawaban ini untuk saat ini karena memiliki solusi paling konkret. Menggunakan nomor seri dari / proc / cpuinfo mungkin merupakan tautan yang hilang.
Schrockwell
6

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

  1. Seberapa besar kemungkinan ini terjadi?
  2. Apa nilai bagi orang lain dari algoritma dan data Anda?
  3. Berapa biaya bagi mereka untuk membeli lisensi untuk menggunakan perangkat lunak Anda?
  4. Berapa biaya bagi mereka untuk mereplikasi algoritma dan data Anda?
  5. Berapa biaya bagi mereka untuk merekayasa balik algoritma dan data Anda?
  6. Berapa biaya untuk melindungi algoritma dan data Anda?

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

  • Bagaimana Anda mengamankan algoritma dan data 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 .

Mark Booth
sumber
SaaS mungkin merupakan opsi, tetapi Anda harus menyadari bahwa Anda perlu memeriksa kembali poin 1 hingga 6 untuk setiap server yang Anda letakkan online. Anda juga terkena serangan DDoS.
Avio
4

Baru-baru ini saya menemukan solusi yang sangat elegan untuk masalah yang tidak terpecahkan ini. Itu terinspirasi oleh komik xkcd ini:

masukkan deskripsi gambar di sini

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!

masukkan deskripsi gambar di sini

ADOConnection
sumber
Seseorang dapat dengan mudah membuat file gambar ( dd) darinya, dan menggunakannya sesuai!
Vassilis
@ Vassilis tidak mungkin tanpa masuk, atau tidak?
ADOConnection
Siapa pun yang memiliki gambar linux langsung dapat melakukannya! Tidak perlu menjadi root sistem Anda .
Vassilis
@Vassilis, bolehkah saya meminta Anda untuk menunjuk pada artikel yang menjelaskan prosedur ini
ADOConnection
Hal pertama yang muncul di google adalah ini
Vassilis
2

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.

Tomas Q.
sumber
1
Enkripsi selama boot tidak seaman yang Anda kira. Anda hanya perlu mengakses / memotong boot sistem normal dan itu semua daging cincang. Bahkan Blurays tidak melakukan ini dengan benar .. sial!
Piotr Kula
Hanya sistem yang benar-benar tertutup yang dapat melindungi aplikasi Anda. Saya hanya tahu satu hal yang agak dapat diprogram - Kartu Java.
Tomas Q.
1
Ya- tetapi Anda selalu harus memasukkan PIN - PIN tersebut TIDAK PERNAH disimpan di kartu.
Piotr Kula
1

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.

  1. Tulis firmware kepatutan untuk BCM yang menghasilkan satu kode masuk berdasarkan pada beberapa algoritma rahasia yang hanya dapat digunakan dalam 10 detik berikutnya.
  2. Kompilasi kernel Anda sendiri dengan perangkat lunak milik Anda dan aktifkan beberapa fitur Linux yang memungkinkan Anda untuk me-mount root dari file terenkripsi pada flash, yang berisi partisi terenkripsi lainnya dengan perangkat lunak Anda. (Perlindungan ganda)
  3. Firmware BCM Anda akan menghasilkan rahasia sekali kunci auth didasarkan pada beberapa algoritma pintar atau kunci publik dan meneruskannya ke linux kustom Anda, yang akan memuat partisi root yang dienkripsi dan melakukan beberapa hal kriptografi lainnya saat boot untuk memuat drive perangkat lunak terenkripsi Anda dalam gambar terenkripsi.

TIPS

  • Kunci autentik yang baik tidak panjang 8-16 karakter. Penting untuk memasok kunci auth panjang 256/512 byte menggunakan simbol sistem lebih banyak sistem (HEX) dan lebih sedikit karakter (ASCII)
  • Jangan gunakan AES, TKIP karena mudah retak
  • Saat ini, enkripsi Whirlpool adalah yang paling rumit untuk dipecahkan menggunakan 256/512 kunci
  • Bahkan jika seorang hacker dapat menghapus flash drive atau membuang konten. perangkat lunak Anda dienkripsi dua kali.
  • Jika mereka memotong kunci auth, itu akan sangat sulit untuk keluar dari firmware (karena BCM dapat mencegah dump firmware)
  • Beberapa ROM flash pintar juga memiliki fitur untuk mencegah kesedihan memori penuh.
  • Jika Anda mendesain PCB, Anda akan mengimplementasikan (seperti Dell dan Apple) chip keamanan yang menyediakan semua data dan kunci enkripsi Anda dan mencegah upaya bruteforce. Beberapa Dell memiliki penghancuran diri untuk penggunaan Militer. Jika Anda memasukkan kata sandi BIOS yang salah 2 kali menghapus drive dengan bom pencar. Anda dapat menerapkan hal yang sama jika Anda mendeteksi manipulasi kunci auth.

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

  • Tulis perangkat lunak Anda sehingga dapat dikompilasi dan digunakan untuk sistem target dalam format biner. Contoh EXE untuk windows yang berjalan di .NET, JAR untuk Java atau (Tidak yakin di linux, C ++?)
  • Ingat, semakin baik keamanan yang Anda inginkan- Semakin banyak uang yang harus Anda keluarkan untuk itu. Tidak ada pengecualian.
Piotr Kula
sumber
1

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.

b26
sumber
0

Anda dapat menggunakan solusi berbasis piggy-back: Software Serial Protection untuk Raspberry Pi

Paulo Arede
sumber
2
Perbaiki saya jika saya salah tetapi perangkat ini sepertinya tidak menambah perlindungan terhadap rekayasa balik. Pemeriksaan hardcoded sederhana pada nomor seri CPU akan melakukan hal yang sama.
EDP
0

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.

Thomas McNeill
sumber
-4

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.

Sean
sumber
1
Halo dan selamat datang. Ada banyak tebakan dan kepercayaan pada pos itu. Sebelum merekomendasikan orang untuk menerapkan 12 V ke Pi, akan sangat disarankan untuk memberikan jawaban yang lebih terperinci dan mendukungnya dengan referensi yang sesuai.
Ghanima