Seberapa amankah kompilasi kode sumber dari orang asing acak? [Tutup]


41

Misalkan saya meninjau kode yang dikirim pelamar pekerjaan untuk membuktikan keterampilan mereka. Jelas saya tidak ingin menjalankan executables yang mereka kirim. Tidak begitu jelas saya lebih suka tidak menjalankan hasil kompilasi kode mereka (hanya misalnya, Java memungkinkan untuk menyembunyikan kode yang dapat dijalankan dalam komentar ).

Bagaimana dengan kompilasi kode mereka? Saya ingin peringatan kompiler jika ada tetapi bagaimana jika kode mereka mengandung beberapa urutan karakter yang pintar yang mengeksploitasi kompiler saya dan kompiler saya membahayakan mesin saya?

Ketika saya Google untuk "kerentanan kompiler" hit yang saya dapatkan adalah semua tentang optimisasi kompiler dan emisi kode dan apakah kode yang dipancarkan seaman kode sumber asli dimaksudkan.

Apakah kompiler biasanya divalidasi untuk memastikan mereka tidak akan membahayakan mesin pengguna ketika mengkompilasi beberapa kode yang pintar? Seberapa amankah kompilasi kode dari orang asing?


40
Cukup gunakan mesin virtual ...
Florian Margaine

14
Jika Anda benar-benar meninjau kode, maka itu harus cukup sulit untuk mendapatkan sesuatu sekeras "pwning the user machine" tanpa diketahui, kan?
RemcoGerlich

17
Jadi, bagaimana Anda menilai keterampilan mereka? Saya menanyakan hal ini karena saya sering meninjau kode yang dikirimkan kepada kami oleh pelamar pekerjaan, tetapi saya selalu membacanya, tidak pernah merasa perlu untuk menjalankannya.
RemcoGerlich

9
Java mengizinkan penyembunyian kode runnable dalam komentar. Tidak semua Java IDEs melakukan konversi unicode ketika melakukan penyorotan sintaksis, yang bukan merupakan hal yang sama.
Pete Kirkham

68
Bahkan tidak membaca kodenya. Mereka dapat mengeksploitasi kerentanan di otak Anda.
Henrik

Jawaban:


34

Tergantung.

Bagian makefile ini bisa menghapus direktori home Anda:

all:
    rm -rf ~

Jadi, jika Anda perlu menggunakan alat (seperti sistem cmake atau makefile), maka itu tidak aman. Itu tergantung seberapa jahat pembuat kode itu.

Di sisi lain, kompiler diprogram oleh orang-orang, sehingga mereka mendapat bug. Jadi, mungkin bisa saja seseorang menemukan cara untuk mengeksekusi kode berbahaya selama kompilasi.

Seperti yang disarankan dalam komentar, jika Anda ingin memastikan bahwa tidak ada hal lucu yang dilakukan pada mesin Anda, gunakan mesin virtual.


32
"Gunakan mesin virtual" - dan jika Anda benar-benar paranoid, ingatlah bahwa dengan mengeksploitasi banyak kekurangan, malware berpotensi naik dari VM Anda dan mencekik Anda ( venom.crowdstrike.com )
Steve Jessop

23
@SteveJessop ya, lebih baik gunakan VM bersarang;) Kemungkinannya adalah pembuat kode tidak menyadari bahwa setelah pecah dari satu VM, dia masih di dalam yang lain.
Ruslan

3
Atau cukup gunakan laptop lama untuk menguji kode. Selama tidak memiliki kapabilitas jaringan Anda akan selalu yakin bahwa malware tidak akan melompat keluar. Kecuali jika bug perangkat lunak secara ajaib terwujud menjadi bug nyata tentunya.
Tiang

5
@Ruslan: sayangnya sebagian besar peretas telah melihat Inception.
Steve Jessop

2
@Ruslan Ini benar-benar tab yang saya buka sebelum halaman ini: matrix.wikia.com/wiki/Matrix_in_a_Matrix_theory yang saya baca karena ada pertanyaan yang tidak berhubungan di situs SciFi SE.
armani

23

Saya cukup yakin di suatu tempat dalam bisnis ini ada beberapa orang pintar yang telah membuat peretasan untuk bahasa tertentu dan versi kompiler. Tempat favorit saya untuk mencari sesuatu seperti ini mungkin akan menjadi kontes C Internasional yang dikaburkan - (tidak tahu apakah ada sesuatu yang sebanding dengan Jawa). Namun, pada kenyataannya, seberapa tinggi Anda mempertimbangkan risiko, diasumsikan itu

  • pelamar membuat kesan yang masuk akal pada Anda dia benar-benar menginginkan pekerjaan di perusahaan Anda (dan bukan gugatan)

  • pria itu tidak tahu berapa banyak ulasan dilakukan pada Anda

  • dia tidak tahu versi kompiler yang Anda gunakan

  • dia tidak tahu apakah Anda menggunakan lingkungan virtual atau kompiler online, hanya untuk aman

  • Anda tidak menerima program yang terlalu besar untuk ditinjau secara efektif

  • Anda tidak mengkompilasi apa pun yang terlihat mencurigakan bagi Anda

  • tidak banyak orang di dunia yang benar-benar tahu bagaimana menyelesaikan tugas seperti itu secara teknis (dan googling sendiri tidak akan memberi Anda "referensi cepat" atau tutorial tentang ini, seperti yang sudah Anda ketahui sendiri).

Jadi meskipun secara teori kompilasi tidak "benar-benar aman", IMHO pada kenyataannya risikonya sangat rendah sehingga "kompiler Anda dikosongkan".


15
Kebingungan itu baik. Curang lebih baik. underhanded-c.org

11
"pelamar benar-benar menginginkan pekerjaan di perusahaan Anda (dan bukan gugatan)" Tidak jelas bahwa orang asing yang mengirim lamaran benar-benar menginginkan pekerjaan itu.
Christian

@Christian: jelas. Tapi saya kira OP tidak akan menginvestasikan waktu untuk meninjau kode pelamar jika yang terakhir tidak muncul dengan setidaknya penampilan yang masuk akal mengenai permintaan pekerjaannya. Dan juga orang asing mungkin tidak mau digugat. Maksud saya adalah: masing-masing poin di atas sendiri dapat dielakkan, tetapi semuanya? Itu risiko yang sangat rendah.
Doc Brown

13

Kami harus membedakan beberapa kasus:

  1. Bug dalam kompiler. Seperti setiap program yang kompleks, kompiler mungkin memiliki bug, dan salah satu bug itu dapat dieksploitasi.
  2. Seekor Kuda Trojan. Penyerang mungkin membuat Anda mengeksekusi beberapa kode arbitrer sebagai bagian dari proses kompilasi. A Makefile, a build.xml, configureskrip shell, dll. Secara teknis, ini bukan karena mengkompilasi kode penyerang melainkan mengatur lingkungan kompilasi.
  3. Bahasa memungkinkan kode sewenang-wenang dijalankan pada waktu kompilasi. Bahasa makro Scala adalah Scala, bahasa makro Common Lisp adalah Common Lisp, Templat Bahasa makro Haskell adalah Haskell. Scala juga memiliki plug-in compiler, yang lagi-lagi adalah kode Scala yang berubah-ubah yang berjalan pada waktu kompilasi. F # memiliki penyedia tipe.
  4. Bahasa yang memungkinkan Turing-perhitungan pada waktu kompilasi. Sistem tipe Scala dan Haskell adalah Turing-complete, seperti juga C ++'s Templates. Anda bisa membuat kompiler melakukan komputasi Turing sembarang pada waktu kompilasi, termasuk tetapi tidak terbatas pada loop tak terbatas. Perhatikan bahwa Turing-complete hanya berarti Anda dapat menghitung setiap fungsi Turing-computable, itu tidak berarti bahwa Anda dapat mengakses sistem file atau sesuatu seperti itu. Tetapi, Anda dapat membuat program yang membutuhkan waktu lama untuk dikompilasi.
  5. Waktu kompilasi yang sangat lama. Misalnya, aturan C # untuk resolusi kelebihan beban sangat rumit sehingga Anda dapat menyandikan masalah 3-SAT sebagai resolusi kelebihan # C. 3-SAT, tentu saja, terkenal NP-lengkap. Dengan kata lain, menurut pengetahuan kami saat ini, mustahil untuk menemukan algoritma yang efisien untuk resolusi kelebihan di C #. Anda tidak dapat membuat kompilasi memakan waktu lama, tetapi tidak butuh program besar untuk membuat kompilasi memakan waktu lebih lama dari umur alam semesta, yang secara praktis adalah hal yang sama.

# 4 dan # 5. paling banyak akan menghasilkan penolakan layanan. Secara praktis, kompiler C ++ dan Scala membatasi jumlah rekursi yang dapat Anda lakukan, sehingga sebenarnya tidak mungkin untuk menulis infinite loop. Dalam Scala, itu hanya kendala implementasi, tetapi dalam C ++, itu secara eksplisit diizinkan oleh spec, saya percaya.

# 2. secara teknis berada di luar ruang lingkup pertanyaan karena pertanyaannya adalah tentang mengkompilasi kode yang tidak menjalankannya (OTOH, ada pertanyaan filosofis yang mendalam: jika memeriksa jenis program Haskell dapat melakukan perhitungan Turing secara sewenang-wenang, apakah itu kompilasi atau menjalankan program?)

# 1. tidak seperti. Di satu sisi, kompiler produksi sangat kompleks, sehingga kemungkinan bug tinggi. Di sisi lain, mereka diuji secara ketat, setelah semua, menangani input yang dibentuk dengan anggun adalah bagian dari deskripsi pekerjaan kompiler. Bahkan jika mereka tidak diuji, mereka akan dibombardir dengan kode yang tidak terbentuk dengan baik ... lihat saja beberapa pertanyaan StackOverflow untuk contoh-contoh apa yang dibuang orang sampah pada kompiler mereka!

Ini memberi kita 3. Beberapa kompiler dapat membatasi jenis akses yang dimiliki kode waktu kompilasi ke sistem, tetapi untuk beberapa kasus penggunaan, memiliki akses penuh tidak dapat dihindari. Tujuan dari penyedia tipe F #, misalnya, adalah untuk "memalsukan" tipe sintetik untuk data yang sistem tipenya tidak cocok dengan F #, sehingga Anda dapat berinteraksi dengan, katakanlah, layanan web yang memiliki skema WSDL dalam jenis yang diketik dengan kuat. mode. Namun, untuk melakukan ini, penyedia tipe perlu memiliki akses ke sumber daya skema WSDL baik di sistem file atau di web, sehingga harus memiliki sistem file dan akses jaringan.

Jadi, apakah ini aman? Secara teknis, tidak. Apakah ini berisiko? Tidak juga.


1
C ++ memang membatasi kedalaman contoh template untuk beberapa nilai tergantung implementasi. Ini dulu beberapa lusin; implementasi modern telah meningkatkan batas hingga beberapa ratus. Namun, itu benar-benar sepele untuk menggandakan jumlah contoh template per level, sehingga 100 level akan membutuhkan kompiler untuk membuat instance 2 ^ 100 template. Itu sampai hanya serangan DoS.
MSalters

3

Seharusnya tidak ada risiko hanya dengan menyusun kode. Secara teori mungkin ada bug di kompiler yang bisa dimanfaatkan oleh peretas cerdas tetapi terdengar sangat tidak mungkin.

Ketahuilah bahwa bangunan mungkin tidak aman. Sebagai contoh di C # 'build event' memungkinkan Anda untuk menentukan baris perintah sembarang untuk dieksekusi sebelum dan setelah membangun, yang jelas berbahaya, dan jauh lebih mudah untuk dieksploitasi daripada mengatakan buffer overflows dalam kode kompiler.


3
Scala, Template Haskell, hampir semua Lisps dapat mengeksekusi kode arbitrer pada waktu kompilasi. Semua bahasa dengan sistem tipe Turing-complete (Scala, Haskell) dapat melakukan komputasi Turing sewenang-wenang pada waktu kompilasi termasuk tetapi tidak terbatas pada loop tak terbatas. Sistem Template C ++ adalah Turing-complete, sekali lagi, memungkinkan Anda untuk melakukan komputasi sewenang-wenang termasuk loop tak terbatas pada waktu kompilasi. Resolusi kelebihan C # adalah setara dengan 3-SAT, oleh karena itu NP-lengkap, yang bukan Turing-lengkap tetapi masih akan memungkinkan Anda untuk menggantung kompilator untuk umur semesta jika Anda mau.
Jörg W Mittag

3
Sistem tipe Turing-complete tidak memungkinkan Anda memasang komputer. Paling buruk itu akan membuat kompiler hang jika Anda mengeksploitasinya. Tapi ya jika Anda memiliki bahasa di mana langkah kompilasi dapat mengeksekusi kode arbitrer maka jelas Anda tidak harus mengkompilasi kode yang tidak dipercaya.
JacquesB

3

Alih-alih berspekulasi, saya malah repot-repot melakukan riset tentang topik ini sebelum menjawab, pergi ke sumber daya paling otoritatif yang bisa saya pikirkan ( Detail CVE ). Daftar lengkap dari eksploitasi keamanan yang diungkapkan kepada publik ini mungkin adalah yang terbaik yang dapat dilakukan seseorang untuk menilai tingkat ancaman dari berbagai jenis perangkat lunak.

Saya tidak mengambil waktu untuk membaca semua materi yang tersedia, tentu saja, tetapi saya memilih beberapa kompiler "IDE" utama, IDE, dan editor teks untuk menghasilkan penilaian ancaman sampel. Jika Anda serius menjalankan perangkat lunak apa pun, setidaknya Anda harus melihat ancaman apa yang ada di luar sana. Juga perhatikan bahwa perangkat lunak yang lebih lama umumnya lebih bug dari perangkat lunak yang lebih baru, jadi menjalankan yang terbaru dari apa pun yang Anda jalankan adalah yang ideal.

Pertama, kita bisa melihat berbagai editor teks. Tampaknya editor terbaik adalah yang paling sederhana. Vi jika Anda menggunakan shell Linux, atau Notepad jika Anda menggunakan Windows. Sesuatu tanpa kemampuan pemformatan, tanpa penguraian, hanya melihat langsung data dan penghentian penguraian otomatis jika satu karakter berada di luar skema pengkodean saat ini. Bahkan Notepad ++ memiliki beberapa kelemahan. Hindari sesuatu yang rumit saat melihat file yang tidak dipercaya.

Kedua, kita dapat melihat IDE. Jika Anda memilih untuk membuka file dalam IDE, Anda harus menyadari bahwa beberapa IDE telah melaporkan bug. Rupanya Visual Studio memiliki eksploitasi yang tersedia melalui mekanisme ekstensi, jadi membuka solusi mungkin bermasalah. Menghindari IDE menghindari seluruh kelas masalah antara Anda dan kode yang tidak dipercaya. Bertahan dengan VI sepertinya jauh lebih aman.

Ketiga, kita bisa melihat kompiler yang sebenarnya. Saya melihat-lihat beberapa, termasuk Adobe, Microsoft, Java, dan GNU C / C ++, dan menemukan bahwa secara umum, mengkompilasi kode (dan bahkan membangun , dengan asumsi tidak ada file make-custom) relatif aman, tetapi masing-masing dari kompiler itu melakukan atau melakukan memiliki eksploitasi keamanan yang dapat muncul dari menjalankan binari yang dikompilasi. Dengan kata lain, mereka tidak bisa mengambil alih sistem Anda hanya dengan mengkompilasi, tetapi mereka bisa dengan menjalankan kode.

Jadi, sebagai kesimpulan, dengan asumsi metode pengiriman belum membajak sistem Anda (mis. Klien surel Anda diretas, atau drive USB yang digunakan terinfeksi) ..., membaca kode sumber dan menyusun kode sumber mungkin aman . Dengan meneliti perangkat lunak spesifik Anda, Anda bisa membuatnya lebih aman dengan, katakanlah, memvalidasi file ada di halaman kode yang benar, dll. Menjalankan kode hanya boleh dilakukan pada perangkat keras yang tidak Anda pedulikan. Bukan VM, tetapi keseluruhan komputer yang berbeda secara fisik tanpa akses jaringan dan tidak ada file sensitif atau perangkat eksternal. Bahkan jika Anda berpikir Anda memahami kode tersebut, penelitian sederhana menunjukkan bahwa bahkan kompiler memiliki bug yang memungkinkan eksploitasi buffer overflow tersembunyi untuk menyelinap dari belakang dan mengeksekusi kode arbitrer, tetapi hanya jika Anda memilih untukjalankan atau debug program. Kompilasi yang sebenarnya harus aman.


2

Yah, saya akan mulai dengan "meninjau kode mereka". Mengapa ada kebutuhan untuk benar-benar menjalankan kode?

Selain itu, ada banyak kompiler online di mana Anda bisa memasukkan kode dan mengkompilasi dan / atau menjalankannya. Anda dapat menjadikannya sebagai persyaratan: kompilasi dalam kompiler online ini dan itu.

Berikut adalah contoh halaman dengan kompiler online: Kompiler online

Kode untuk ditinjau untuk wawancara kerja seharusnya tidak terlalu besar karena Anda tidak mengerti apa yang sedang terjadi.


3
"Mengapa ada kebutuhan untuk benar-benar menjalankan kode?" Untuk mengetahui apakah ada gunanya, tentu saja, ulasan hanya memberi tahu Anda bahwa kegagalannya halus :-). "Waspadalah terhadap bug dalam kode di atas; Saya hanya membuktikannya benar, tidak mencobanya." - Knuth
Steve Jessop

2

Apakah kompiler biasanya divalidasi untuk memastikan mereka tidak menabrak mesin pengguna saat mengkompilasi beberapa kode yang pintar?

Secara umum mereka terlalu kompleks dan sering ditulis menggunakan bahasa yang tidak praktis untuk membuktikan properti ini.

Mungkin tidak dengan maksud khusus ini, tetapi gagasan kompiler pengujian fuzz setidaknya diketahui ( LLVM sekarang dapat menguji fuzz itu sendiri ). Pengujian yang dimaksudkan untuk mendapatkan input yang membuat crash kompiler karena bug kompiler cenderung juga akan meningkatkan kelemahan yang dapat dieksploitasi.

Secara alami Anda harus melihat apakah kompiler spesifik yang Anda minati diuji atau tidak-fuzz untuk menemukan potensi kerusakan, dan apakah bug yang ditemukan benar-benar diperbaiki. Rule of thumb adalah bahwa jika ada crash lebih buruk daripada pengecualian kehabisan memori, maka tanpa menyelidiki rincian lebih lanjut Anda harus mempertimbangkan kemungkinan serius mereka dapat dimanfaatkan untuk eksploitasi.

Seberapa amankah kompilasi kode dari orang asing?

Sayangnya, berapa lama seutas tali. Pada prinsipnya email tersebut dapat mengeksploitasi klien email Anda, atau kode sumber mungkin mengeksploitasi editor teks atau cppcheck Anda, bahkan sebelum mencapai kompiler Anda. Saran Sebastian dalam komentar untuk menggunakan kompiler online cukup bagus, tetapi tentu saja kode harus dalam bentuk yang akan diterima oleh kompiler.

Bahasa atau kompiler dengan fasilitas apa pun untuk pelaksanaan kode umum waktu kompilasi tentu saja sangat mencurigakan. Templat C ++ secara fungsional lengkap tetapi tidak memiliki (dimaksudkan) akses ke sistem, sehingga mereka relatif berisiko rendah. BЈовић menyebutkan makerisiko sangat tinggi (karena mengeksekusi kode orang asing, hanya saja kode tersebut ditulis dalam makebahasa, bukan dalam C ++). Jika kompiler akan berjalan systemmaka Anda berada di kapal yang sama. Saya dulu bekerja dengan assembler yang, jika saya ingat dengan benar, dapat melakukan eksekusi kode waktu kompilasi sewenang-wenang. Itu dimaksudkan untuk menghitung tabel pencarian, tapi saya tidak berpikir ada yang menghalangi Anda membuat panggilan sistem.

Dalam praktiknya , jika kodenya terlihat OK untuk saya dan saya pikir saya memahaminya, maka saya akan menganggapnya risiko yang sangat rendah untuk mengkompilasinya, risiko yang jauh lebih rendah daripada mengatakan "menjelajah internet dengan browser yang terkunci". Saya melakukan hal-hal yang berisiko secara rutin pada mesin serba guna saya, tetapi banyak dari mereka yang tidak saya lakukan misalnya di dalam lab virus atau di server kritis. Jika kode itu tampak lucu atau jelas dikaburkan maka saya mungkin tidak mengambil risiko mengkompilasinya karena, selain dari risiko itu bisa mengandung exploit yang tersembunyi di sampah yang tidak dapat dibaca, itu kode sampah. Kode curang sulit tetapi memungkinkan. Kode curang yang memasang mesin melalui eksploitasi kompiler perlu berisi muatan yang dapat dieksekusi yang tidak sepele, jadi sangat sulit.

Jika Anda ingin melihat lebih jauh, coba tanyakan kepada orang-orang yang meng-host kompiler online. Jika itu belum dilakukan pada mereka maka (kecuali Anda datang ke perhatian NSA atau yang setara), Anda dapat dengan wajar menganggap itu tidak akan dilakukan untuk Anda. Mereka berupaya menjalankan kompiler mereka di kotak pasir yang tepat, yang mungkin lebih banyak usaha daripada yang Anda mau, tetapi mereka setidaknya bisa memberi tahu Anda seberapa sering kotak pasir itu menyelamatkan mereka dari masalah.


Karena bekerja oleh Profesor John Regehr di University of Utah, dentang dan gcc telah melalui pengujian fuzz yang agak intensif, memalu ratusan cacat yang dapat menyebabkan kompiler mogok atau bahkan menghasilkan kode yang berperilaku berbeda dari kompiler lain. Yang harus dicari adalah bug yang masih terbuka, dan apakah itu merupakan ancaman.
Phil Miller

@Novelocrat: setuju, dan terima kasih atas info spesifiknya. Ketakutan saya adalah bahwa tim compiler dev mungkin menilai bug sebagai prioritas rendah karena "tak seorang pun akan pernah menulis bahwa kode", dan mereka belum diperbaiki belum , sedangkan setelah Anda sedang memikirkan compiler sebagai serangan permukaan Anda akan mempertimbangkan mereka kritis. Pikiran Anda, semoga kebanggaan akan memastikan bahwa kompiler-penulis tidak akan membiarkan sesuatu yang memalukan sebagai buffer write overflow stand ;-)
Steve Jessop

1

Meskipun ini umumnya menjadi perhatian, saya pikir masalah ini tidak ada karena pengaturannya.

Pemohon mengirimi Anda beberapa kode sumber. Bagaimana atau mengapa itu terjadi?

Yah jelas hanya ada tiga kemungkinan:

  1. Anda memberi pelamar tugas untuk memecahkan masalah tertentu (yang didefinisikan dengan baik) untuk menilai keterampilannya.
  2. Pemohon ingin memamerkan sesuatu yang keren yang ditulisnya.
  3. Pemohon adalah orang brengsek atau mata-mata atau orang jahat dan sebenarnya tidak tertarik dipekerjakan. Yang ia harapkan hanyalah Anda cukup bodoh untuk menjalankan kodenya.

Tentang 2) dan 3)

Risiko utama adalah membedakan antara 2) dan 3). Kemungkinan besar bahwa jika apa pun yang ditulisnya layak untuk dilihat , itu adalah sesuatu yang bisa Anda dapatkan kode sumbernya untuk daring (dari sumber "netral") dan Anda bahkan mungkin sudah tidak asing lagi, atau itu adalah sesuatu yang sebenarnya tidak Anda ketahui. tidak ingin melihatnya karena Anda akan melanggar kekayaan intelektual pesaing (mantan majikan). Yang terakhir berarti Anda tidak akan mau mempekerjakan orang itu.
Jika Anda bisa mendapatkan sumbernya secara online, lakukanlah. Jika Anda dapat memverifikasi kontribusi pemohon ke perangkat lunak terkenal (termasuk perangkat lunak berpemilik) dengan namanya di suatu tempat dalam kredit, lakukanlah.
Dalam setiap kasus lainnya, abaikan saja apa yang dia kirimkan kepada Anda. Entah itu tidak layak dilihat, atau ilegal, atau berisiko tinggi.

Sekitar 1)

Pemohon mengirimi Anda sesuatu karena Anda memberinya tugas. Jika Anda memiliki setiap kompetensi (yang saya asumsikan Anda lakukan!), Maka untuk tugas pemrograman khas (... bahwa Anda bahkan memilih sendiri!), Anda akan dapat mengatakan apakah itu solusi yang masuk akal bahwa penampilan seolah-olah itu mungkin bekerja dengan melihat kode sumber kurang dari 30 detik (lebih mungkin 10 detik).

Jika Anda tidak dapat mengatakan bahwa program itu mungkin akan berfungsi (atau apa yang dilakukannya) dalam 30 detik, orang yang menulisnya bukan tipe orang yang ingin Anda pekerjakan, bekerja penuh. Anda ingin orang yang menulis kode yang dapat dipahami dan dipelihara manusia lain. Anda tidak ingin seseorang yang mencoba untuk menjadi pintar pada Anda, atau seseorang yang secara teratur memenangkan kontes C yang dikaburkan. Bahkan tidak masalah apakah program itu bekerja. Begitu orang lain tidak dapat memahami kode itu, kode itu tidak pernah "berfungsi".
Jika program terlihat seperti itu mungkin akan berfungsi, tetapi Anda menemukan sesuatu yang tampak "aneh" (katakanlah, urutan pelepasan unicode Java, C ++ string string literal, hal-hal yang terlihat seperti trigraph, apa pun), perlakukan tugas sebagai "gagal", pindahkan ke pelamar berikutnya. Tidak perlu memasukkan hal seperti itu di 99% dari semua program (dan, tentu saja, tidak dalam tugas Anda - saya harap). Jadi jika Anda menemukan sesuatu yang "aneh" seperti itu, pelamar bukanlah seseorang yang ingin Anda sewa.

Jika kode melewati triase pertama, Anda mungkin ingin menghabiskan 2-3 menit untuk melihatnya lebih teliti. Jika Anda masih senang dengan apa yang Anda lihat setelah itu, Anda dapat menjalankannya melalui penganalisa statis dan mengompilasinya dalam mesin virtual pada tingkat peringatan tinggi.

Itu akan memunculkan masalah yang mungkin Anda lewatkan saat membaca sumbernya (seperti menjalankan perilaku yang tidak jelas atau mempersempit konversi).
Kompilasi pertama-tama dan terutama akan memberi tahu Anda apakah pelamar memiliki ketekunan dan perhatian terhadap perincian yang diperlukan, tidak begitu banyak apakah ia memiliki keterampilan pemrograman. Sama seperti menuliskan nama majikan dengan benar pada aplikasi Anda dan memeriksa ejaan CV Anda sebelum menyerahkannya, adalah praktik terbaik bahwa Anda memastikan kode sumber apa pun yang Anda serahkan kompilasi tanpa kesalahan (dan lebih disukai tanpa peringatan). Jika seseorang gagal melakukan itu, Anda tidak ingin mempekerjakannya.

Risiko hal-hal jahat yang terjadi pada saat ini (mengeksploitasi kompiler dan keluar dari VM) dapat diabaikan, melihat bagaimana Anda telah menjalankan pemeriksaan masuk akal atas kode. Tidak akan terjadi.


0

Jika kemungkinan itu membuat Anda khawatir, bawa mesin yang lebih lama (bukankah sebagian besar dari kita memiliki sedikit waktu?), Instal versi Linux saat ini dan kompiler & c, salin kode sumbernya, cabut kabel jaringan (atau matikan WiFi ), dan lakukan kompilasi. Jika sesuatu yang buruk terjadi, itu tidak akan * mempengaruhi hal lain.

Dan untuk malware di Makefile, jalankan dengan flag -n (IIRC, RTMF) untuk melihat apa yang akan dilakukannya tanpa benar-benar melakukannya.

* Kecuali tentu saja programmer Anda mengkodekan malware sehingga menunggu koneksi ulang, tetapi dalam kasus itu Anda a) menghapus mesin; dan b) meneruskan resume orang itu ke NSA, karena dia terbuang sia-sia di dunia komersial :-)


0

Intinya adalah bahwa ada adalah risiko. Risiko ini cukup kecil seperti yang dicatat oleh jawaban lain, tetapi ada risiko. Itu berarti Anda perlu mengajukan dua pertanyaan:

  1. Apa yang bisa saya lakukan untuk mengurangi risiko?
  2. Apakah risikonya cukup tinggi sehingga saya harus peduli?

Yang kedua adalah apa yang Anda ajukan di sini dalam pertanyaan ini, tetapi fokus yang salah untuk kasus khusus ini. Jawaban untuk mengurangi risiko sudah jelas dan tersedia: jangan mengkompilasi kode pada mesin Anda . Anda memiliki dua cara kompilasi yang jelas tanpa menggunakan mesin Anda:

  1. Gunakan mesin virtual (seperti @FlorianMargaine langsung tunjukkan dalam komentar). Anda cukup snapshot sebelum kompilasi dan kemudian mengembalikan snapshot setelah selesai.
  2. Gunakan layanan yang di-host (seperti kompiler online).

Cara-cara mitigasi risiko Anda sangat jelas, murah, dan mudah diakses sehingga tidak layak menghabiskan banyak waktu untuk menganalisis seberapa besar risikonya. Lakukan saja salah satu dari mereka dan lakukan dengan itu.


0

Visual Studio sebenarnya memperingatkan Anda jika Anda membuka proyek dari lokasi yang tidak terpercaya (e, g, diunduh atau berbagi jaringan).

Salah satu contoh bagaimana ini dapat dieksploitasi akan dengan proyek WPF: Anda dapat mereferensikan kelas .NET dari XAML, dan untuk menyediakan IntelliSense, VS memuat dan mengeksekusi kelas referensi pada waktu desain.

Itu berarti penyerang dapat menjatuhkan .dll berbahaya ke direktori bin, mengganti kode sumber dengan yang tidak berbahaya, dan pada waktu desain, DLL dieksekusi. Setelah bangunan pertama Anda, setiap jejak biner jahat hilang.

Jadi meskipun semua kode yang disediakan adalah "bersih", kompilernya bebas bug dan Anda, tentu saja, tidak pernah secara manual menjalankan semua yang disediakan .EXE, kode jahat masih dapat dieksekusi di latar belakang. (Agar aman dari serangan spesifik itu, Anda bisa memastikan bahwa tidak ada binari di pohon direktori sebelum membuka solusi. VS kemudian akan meminta Anda untuk membangun solusi sebelum menyediakan IntelliSense pada waktu desain.)

Vektor serupa mungkin ada dengan bahasa / OS lain.


0

Membaca kode sumber: benar-benar aman. Kompilasi kode sumber: benar-benar aman. Menjalankan binari terkompilasi: yah ... itu tergantung.

Kompilasi hanyalah komputer yang membaca kode sumber dan menulis padanannya dalam bentuk biner. Setelah kompilasi, Anda hanya memiliki 2 dokumen: satu dapat dibaca manusia, dan satu lagi dapat dibaca komputer. Kecuali Anda membuat komputer membaca (yaitu menjalankan) dokumen ke-2, tidak ada yang akan terjadi.


3
Adakah penjelasan mengapa kompilasi benar-benar aman? Seseorang dapat mengirim pesan ke server dengan mengirimkan pesan yang dibuat dengan cerdik - mengapa dia tidak bisa membuat kompiler dengan memberikannya masukan yang dibuat dengan cerdas?
sharptooth

2
Saya pikir Anda akan melihat kode perancang cerdik yang dirancang untuk mengeksploitasi kerentanan di server, atau kompiler. Tetapi mengambil ini secara ekstrim, mengapa mengambil risiko melihat kode sama sekali ?! Ada beberapa eksploitasi pada editor yang dapat dieksploitasi hanya dengan melihat file .
gbjbaanb

2
Jawaban ini adalah omong kosong total. Tidak ada alasan sama sekali mengapa kompiler akan secara inheren aman, atau setidaknya lebih aman daripada sesuatu yang melakukan tugas sederhana seperti mengatur koneksi SSL, namun baru-baru ini perpustakaan populer berisi kerentanan. Saya bahkan berpendapat bahwa, karena kompiler umumnya tidak digunakan dalam lingkungan yang bermusuhan (seperti internet), mereka kurang diperiksa untuk kerentanan, dan karena itu lebih cenderung memilikinya.
Dorus

1
Tidak begitu yakin tentang kompilasi kode yang benar-benar aman. Bahkan di Jawa, dengan Maven (misalnya) " mvn package" yang ceroboh dapat menarik sesuatu dan melakukan tugas dengan plugin tambahan yang mungkin tidak mudah Anda ketahui. Saya yakin hal yang sama dapat diterapkan pada sistem pembangunan lainnya.
Bruno

1
Bahasa Turing-complete dapat memungkinkan suatu program untuk menghabiskan jumlah waktu yang tidak terbatas untuk mengkompilasi, jika kompiler diizinkan untuk menjalankan untuk jumlah waktu yang tidak terbatas , tetapi banyak kompiler akan membuat jumlah utas yang terbatas terlepas dari apa pun yang mungkin muncul di kode sedang dikompilasi, artinya beban CPU dari mencoba mengkompilasi satu program pada suatu waktu akan terbatas. Masalah yang berpotensi lebih besar adalah persyaratan ruang disk; sepenuhnya masuk akal bahwa file sumber 1KB dapat menghasilkan banyak pertunjukan kode objek.
supercat

-1

Saya pikir Anda khawatir tentang salah satu dari dua rasa:

  • malware canggih yang didorong oleh eksploitasi : tidak mungkin, terutama karena ini ditargetkan pada perangkat keras dan / atau perangkat lunak yang sangat spesifik dan [berdasarkan pertanyaan Anda] penyerang Anda mungkin tidak memiliki tingkat pengetahuan sistem itu.
  • hal-hal yang mengacaukan lingkungan Anda : arahan prank jahat (misalnya menghapus direktori home Anda) atau arahan tidak kompeten / tidak kompeten yang mengubah perilaku sistem Anda (misalnya menulis ulang variabel lingkungan PATH atau PERPUSTAKAAN)

Beberapa orang menyarankan mesin virtual atau sistem lama, tetapi saya menawarkan solusi yang jauh lebih mudah: Kompilasi sebagai pengguna yang berbeda dengan izin yang dikurangi / berbeda . Jauh lebih mudah daripada menyiapkan mesin virtual atau komputer khusus.

Jika bahkan sistem Anda tidak dapat digunakan oleh eksploitasi waktu kompilasi, pulihkan dari cadangan (Anda memilikinya, bukan?).

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.