Kasus untuk kode kebingungan?


47

Apa alasan utama untuk menulis kode yang tidak jelas, dalam hal manfaat nyata bagi orang-orang yang mengembangkan kode, dan bisnis yang menjalankan kode itu (jika kode tersebut sebenarnya adalah kode komersial)? Apakah ada kasus yang terdokumentasi (tersedia online di beberapa lokasi) yang menggambarkan kapan kebingungan lebih baik daripada buruk? Apakah ada contoh terkenal di mana, misalnya, kebingungan terbukti secara bermakna menunda pihak ke-3 berbahaya dari mendapatkan kode? Sepertinya, seperti menggulung jendela mobil Anda tidak akan menghentikan orang untuk merusaknya dan mencuri stereo Anda, mengaburkan kode Anda hanya membuat orang jujur ​​jujur.

=========

Latar Belakang:

Ini adalah upaya untuk dengan sengaja menantang asumsi saya tentang topik ini.

Saya menentang penggunaan kode kebingungan secara umum, tetapi saya ingin tahu apakah saya melewatkan sesuatu. Saya mengerti mengapa, dalam kasus-kasus seperti JavaScript, minifikasi membantu hal-hal memuat lebih cepat dan semua (ada manfaat nyata, fungsional di sana), tapi sepertinya saya tidak dapat menemukan satu alasan mengapa kode kebingungan, untuk tujuan menjadi penghalang untuk menemukan apa yang dilakukan oleh bagian kode / algoritma , sebenarnya efektif untuk tujuan apa pun.

Dengan open source menjadi populer gila, pertanyaannya tampaknya "berbagi kode, atau tetap milik?" Ketika datang ke kode komersial, saya bisa mengerti mengapa Anda tidak bisa berbagi semuanya, dan Anda punya hukum di pihak Anda untuk memerangi pencurian.

BTW, jika alasan seseorang menulis kode yang dikaburkan adalah "keamanan pekerjaan" maka saya akan memecat setiap programmer yang ditemukan secara konsisten, dan sengaja menggunakan kebingungan dengan satu-satunya tujuan membantu mempertahankan pekerjaan mereka, kecuali mereka secara wajar dapat menunjukkan bahwa ia memiliki beberapa manfaat bisnis. Benar-benar anti-tim sehingga konyol, dan menunjuk seseorang yang lebih peduli menjaga pekerjaan mereka melalui praktik yang salah arah, kemudian menjaganya karena mereka menulis perangkat lunak yang luar biasa.

Saya hanya menyebutkan kasus khusus ini karena, sementara saya menyadari orang-orang biasanya bercanda, saya ingin mencegah setiap jawaban yang dorongan dasarnya adalah bahwa kebingungan untuk keamanan kerja saja adalah ide yang bagus.


3
Saya pikir Anda telah mengatakan semuanya
Paul


6
Sederhananya, kebingungan mengubah ekonomi rekayasa balik kode Anda, tidak lebih.
Mark Booth

Terimakasih semuanya. Saya tentu saja melihat perspektif yang berbeda tentang ini, berkat jawaban dan komentar Anda yang mendetail. Ada beberapa jawaban berkualitas tinggi yang berbicara tentang berbagai sudut masalah ini. Daripada memberikan satu pertanyaan, saya memilih suara favorit saya.
jefflunt

Apakah Anda mempertimbangkan atau fokus pada kode sumber atau objek / kode yang dapat dieksekusi ? Sebagai contoh, perangkat lunak Gimpel mendistribusikan versi alat serat mereka dalam kode sumber C yang dikaburkan, sehingga, biasanya Unix, klien dapat mengkompilasinya untuk berjalan di lingkungan apa pun yang mereka inginkan, tanpa Gimpel perlu mendukung / memelihara sejumlah N lingkungan target , termasuk lingkungan eksentrik atau warisan. Ini masuk akal berbeda dari objek / kebingungan yang dapat dieksekusi yang digunakan untuk salinan atau perlindungan data (misalnya penyalinan terlarang) sebagai lapisan keamanan untuk menunda / mencegah rekayasa balik.
mctylr

Jawaban:


49

Satu kasus penggunaan yang sangat menarik untuk kebingungan adalah menelusuri asal mula salinan ilegal. Dengan anggapan bahwa kebingungan adalah operasi yang relatif murah, penulis asli dapat memasok setiap klien dengan versi aplikasi yang berbeda, jika salinan terlarang ditemukan, penulis dapat membandingkan dengan versi yang disediakan dan melacak kembali sumber pembajakan.

Itu adalah bentuk steganografi , yang diilhami dan dalam variasi skema kriptografi "pengkhianat" . Saya tidak tahu apakah itu umum 1 , atau bahkan jika itu ide yang baik, tetapi saya sudah melihatnya diterapkan dalam praktik di bawah parameter berikut:

  • Pasar nasional yang sangat kompetitif dengan hanya dua vendor,
  • Sekitar 50 penyebaran mencakup pasar,
  • Waktu pengembangan rata-rata untuk kedua aplikasi adalah beberapa tahun (lebih atau kurang),
  • Waktu kebingungan rata-rata untuk aplikasi kami adalah beberapa jam,
  • Umur untuk kedua aplikasi itu diperkirakan sekitar sepuluh tahun.

Alasannya tentu saja keamanan melalui ketidakjelasan pada awalnya, dan itu berkembang pada skema yang disebutkan di beberapa titik 2 . Kedua vendor memiliki akses ke kode biner masing-masing, secara hukum, dan saya pikir sudah jelas bahwa upaya dekompilasi dari keduanya diharapkan. Kebingungan tidak melakukan apa-apa dalam hal keamanan, dalam jangka panjang. Kedua vendor memiliki tim yang sangat termotivasi dan berbakat, bekerja di pasar yang sangat menguntungkan dan niche, pada akhirnya produk kami lebih mirip daripada tidak, dan setiap keunggulan kompetitif diperoleh melalui cara lain yang kurang jelas.

Saya tidak dapat benar-benar berkembang, karena (a) itu sangat awal dalam karir saya dan saya tidak mendapatkan gambaran yang jelas tentang keputusan desain atau hasil dari skema penelusuran (jika ada) dan (b) beberapa keterlibatan saya dengan proyek itu di bawah NDA.

Kasus penggunaan lain yang valid untuk kebingungan dapat terjadi ketika Anda, entah bagaimana, secara hukum wajib menyerahkan kode Anda kepada pihak ketiga :

Jika perusahaan Anda melakukan IP bekerja untuk perusahaan teknologi, atau terlibat dalam kasus-kasus yang melibatkan kode sumber perangkat lunak, Anda mungkin harus menyerahkan kode sumber klien Anda ke USPTO, pengadilan atau pihak ketiga.

Karena kode sumber dianggap sebagai rahasia dagang, sebagian besar badan pengatur menggunakan aturan "50%". Kode sumber yang dikirimkan tidak jelas sehingga tidak dapat digunakan apa adanya.

IANAL, dan tautannya lebih relevan dengan hard copy kode daripada kode kerja yang sebenarnya, jadi ini mungkin sama sekali tidak relevan.

Sekarang, karena Javascript adalah contoh kanonik untuk kebingungan, ada satu efek samping yang tidak umum dipertimbangkan, dan itu menyembunyikan kode berbahaya di Javascript yang dikaburkan. Meskipun ada keuntungan yang pasti dalam mengecilkan 3 Javascript, saya tidak melihat titik dalam kebingungan yang sebenarnya dan saya senang Douglas Crockford setuju dengan saya :

Lalu akhirnya, ada pertanyaan tentang kode privasi. Ini adalah penyebab yang hilang. Tidak ada transformasi yang akan membuat peretas yang gigih tidak memahami program Anda. Ini ternyata benar untuk semua program dalam semua bahasa, itu hanya lebih jelas dengan JavaScript karena disampaikan dalam bentuk sumber. Manfaat privasi yang diberikan oleh kebingungan adalah ilusi. Jika Anda tidak ingin orang lain melihat program Anda, cabut server Anda.

Adapun kebingungan untuk "keamanan pekerjaan", itu adalah perilaku yang seharusnya tidak pernah melewati tinjauan kode, dan jika diidentifikasi tidak boleh ditoleransi. Saya tidak akan pergi sejauh menembakkan pelakunya pada awalnya, tapi pelanggar berulang pasti pantas dipukul, setidaknya.

Sebagai kesimpulan, kebingungan adalah contoh khas dari keamanan melalui ketidakjelasan, hanya kebaikan yang jelas adalah sebagai pencegah dan tidak lebih. Mungkin ada kasus penggunaan kreatif 4 yang saya tidak tahu, tetapi secara umum manfaatnya minimal, paling-paling.

1 Setelah menulis ini saya menemukan jawaban ini yang pada dasarnya menggambarkan skema yang sama, jadi mungkin lebih umum yang saya pikirkan.
2 Meskipun steganografi masih aman melalui ketidakjelasan.
3 Minifikasi ~ menghapus spasi putih dan memperpendek token, tidak sengaja dikaburkan.
4 Apakah Kontes Kode C Internasional Dikacaukan dihitung?


"Jika Anda tidak ingin orang melihat program Anda, cabut server Anda." - atau gunakan Ekstensi Penjaga Perangkat Lunak dan percayai Intel.
user253751

40

Kasus untuk kebingungan kode adalah ia menaikkan bilah untuk pihak ke-3 untuk menentukan apa / bagaimana kode itu bekerja.

Namun, itu TIDAK berarti bahwa seorang pengembang harus pernah menulis kode yang dikaburkan.

Lihat, ini adalah bagian yang menurut saya tidak ada dalam pertanyaan Anda: Kebingungan kode (seperti JavaScript minimal) tidak perlu - dan tidak boleh - dilakukan secara manual oleh pengembang. Demikian juga, ini tidak boleh disimpan sebagai file sumber inti Anda dalam kontrol versi.

Kebingungan kode harus terjadi sebagai langkah pemrosesan pasca selama kompilasi ke dalam produksi Anda. Ada banyak produk pihak ke-3 untuk melakukan ini juga, jadi hampir tidak ada alasan untuk melakukan ini di rumah.

Misalnya: Dotfuscator

IEEE memiliki makalah tentang efektivitas kebingungan kode

Hasil menunjukkan bahwa pengidentifikasian ulang nama secara signifikan mengurangi efisiensi serangan, setidaknya menggandakan waktu yang dibutuhkan untuk menyelesaikan serangan yang berhasil (bahkan dalam skenario terburuk, yaitu, melawan penyerang terbaik). Selain itu, kebingungan mengurangi kesenjangan antara penyerang pemula dan terampil, membuat yang terakhir kurang efisien , dan membuat sistem yang lebih mudah diserang menjadi lebih mirip dengan yang secara intrinsik lebih sulit untuk dihancurkan.

Tekankan milikku.


2
Saya akan memberi ini +1, tetapi tautannya memerlukan langganan berbayar yang tidak semua pembaca dapat mengaksesnya.
mattnz

Ya, itu adalah fakta yang disayangkan dari IEEE yang tidak sepenuhnya saya sukai, tapi itu topik lain
Dan McGrath

8
Ada versi pdf yang dapat diakses publik di sini . Saya pikir tidak apa-apa untuk menggunakannya sebagai gantinya, itu ada di beranda salah satu penulis makalah, Mariano Ceccato.
yannis

Great ditemukan. Saya telah mencarinya dengan Google Cendekia, tetapi tidak menemukannya. Saya telah memperbarui tautannya.
Dan McGrath

1
+1 untuk "Kebingungan kode (seperti halnya JavaScript) tidak - dan tidak boleh - dilakukan secara manual oleh pengembang"
João Portela

35

Saya telah berpartisipasi dalam pengembangan MMORPG. Ini melibatkan logika server dan logika klien. Sepanjang pengembangan proyek selama bertahun-tahun, setiap kali kami mempertimbangkan antarmuka antara klien dan server, aturannya adalah bahwa klien harus diperlakukan oleh server setiap saat dengan anggapan bahwa ia telah diretas. Dengan kata lain, server harus ditulis sedemikian rupa sehingga tidak ada respons yang dapat datang dari klien yang akan menyebabkan server gagal, atau memungkinkan klien untuk menipu. Namun, sudah diketahui sejak awal bahwa peretas akan menemukan lubang di sistem dan mengeksploitasi mereka untuk menipu. Dan setelah beberapa saat mereka melakukannya.

Tentu saja, sebelum mengirim klien ke dunia besar yang hebat di luar sana, kami memastikan untuk mengaburkannya. Kami percaya kebingungan memiliki efek berikut:

  1. Ini menghalangi para peretas non-ahli untuk mencoba.
  2. Ini menunda peretas ahli dalam mencapai peretasan apa pun.
  3. Ini mengurangi jumlah peretasan yang dicapai oleh peretas ahli.
  4. Ini membatasi efektivitas peretasan.
  5. Yang paling penting: ini menyebabkan para peretas untuk melakukan lebih banyak uji coba dengan klien mereka yang diretas terhadap server kami sebelum mencapai peretasan yang berfungsi, yang meningkatkan kemungkinan kami menemukan mereka dengan mencari aktivitas yang tidak teratur dalam log server.

Akun game dari peretas yang ditemukan dihentikan tanpa pengembalian uang, jadi ini membuat bisnis peretasan lebih mahal dan kurang menarik.

Jadi, karena semua hal di atas, saya percaya kebingungan memiliki efek positif secara keseluruhan dalam permainan kami, dan dengan ekstensi, kebingungan dapat memiliki efek positif secara keseluruhan di setiap bagian dari perangkat lunak yang dapat diretas. (Misalnya, perangkat lunak yang berisi langkah-langkah perlindungan salinan.)

Efek yang memiliki kebingungan pada pemeliharaan hampir tidak ada. Ada beberapa tempat di mana beberapa programmer yang tidak berpengalaman membuat asumsi tentang nama-nama pengidentifikasi, (mereka menggunakan refleksi), tetapi begitu mereka dipilah semuanya baik-baik saja. Langkah kebingungan hanya menjadi bagian dari langkah build keseluruhan untuk versi produksi game, sehingga sebagian besar dari kita pengembang tidak pernah perlu khawatir tentang hal itu atau ada hubungannya dengan itu. Kami sudah memiliki alat untuk melihat log permainan, jadi kami memodifikasi alat untuk menggunakan tabel asosiasi (pemetaan pengidentifikasi yang dikaburkan menjadi pengidentifikasi yang tepat) yang diproduksi oleh obfuscator untuk menerjemahkan log untuk kami dengan cepat, jadi kami tidak pernah bahkan harus melihat pengidentifikasi yang dikaburkan saat melakukan pemeriksaan post-mortem berdasarkan log yang dikumpulkan dari lapangan.


Apa efeknya pada pemeliharaan?
deworde

2
@deworde Saya memperbarui jawaban saya dengan satu paragraf lagi tentang efek kebingungan pada pemeliharaan.
Mike Nakis

@MikeNakis: Darkfall? :-)
Carson63000

@ Carson63000 Ya. (Dan LOL di avatar Anda - apakah itu chainmail dan apakah Anda menggunakan pedang?)
Mike Nakis

@MikeNakis: bagus! Dan ya pada avatar - baik, itu rajutan chainmail dan pedang kayu, perusahaan tempat saya bekerja membuat beberapa aset untuk iklan banner dan meminta staf untuk berpakaian daripada menyewa model. :-)
Carson63000

3

Membaca dan memahami (dan jelas menulis) kode yang dikaburkan dapat menjadi tantangan mental yang menarik. Itu mungkin berada di luar ruang lingkup dari apa yang Anda tanyakan, tetapi contoh-contoh seperti IOCCC mungkin menjadi sumber hiburan sekaligus horor.


3
Ini seharusnya merupakan komentar atas pertanyaan, bukan jawaban.
Dan McGrath
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.