Tiga belas peraturan untuk mengembangkan aplikasi Java yang selamat

Keselamatan adalah salah satu aspek pengembangan perisian yang paling kompleks, luas, dan penting. Keselamatan perisian juga sering diabaikan, atau disederhanakan kepada beberapa penyesuaian kecil pada akhir kitaran pengembangan. Kita dapat melihat hasilnya dalam senarai tahunan pelanggaran keselamatan data utama, yang pada tahun 2019 berjumlah lebih dari 3 bilion rekod yang terdedah. Sekiranya ia boleh berlaku pada Capital One, ia boleh berlaku kepada anda.

Berita baiknya adalah bahawa Java adalah platform pembangunan yang lama dengan banyak ciri keselamatan terbina dalam. Pakej Security Java telah menjalani ujian pertempuran intensif, dan sering diperbarui untuk kelemahan keselamatan baru. Java EE Security API yang lebih baru, yang dirilis pada bulan September 2017, menangani kerentanan dalam seni bina awan dan perkhidmatan mikro. Ekosistem Java juga merangkumi pelbagai alat untuk membuat profil dan melaporkan masalah keselamatan. 

Tetapi walaupun dengan platform pembangunan yang mantap, penting untuk tetap waspada. Pengembangan aplikasi adalah usaha yang kompleks, dan kerentanan dapat disembunyikan di latar belakang kebisingan. Anda harus memikirkan keselamatan di setiap peringkat pengembangan aplikasi, dari ciri bahasa peringkat kelas hingga keizinan titik akhir API.

Peraturan dasar berikut menawarkan asas yang baik untuk membangun aplikasi Java yang lebih selamat.

Peraturan keselamatan Java # 1: Tuliskan kod Java yang bersih dan kuat

Kerentanan suka bersembunyi dalam kerumitan, jadi jaga kod anda semudah mungkin tanpa mengorbankan fungsi. Menggunakan prinsip reka bentuk yang terbukti seperti KERING (jangan ulangi sendiri) akan membantu anda menulis kod yang lebih senang dikaji untuk masalah.  

Sentiasa dedahkan sedikit sebanyak maklumat dalam kod anda. Menyembunyikan butiran pelaksanaan menyokong kod yang dapat dikekalkan dan selamat. Ketiga-tiga petua ini akan membantu menulis kod Java yang selamat:

  • Manfaatkan pengubah akses Java dengan baik . Mengetahui bagaimana menyatakan tahap akses yang berbeza untuk kelas, kaedah, dan atributnya akan banyak melindungi kod anda. Segala sesuatu yang boleh dibuat peribadi, mestilah bersifat peribadi. 
  • Elakkan renungan dan introspeksi . Terdapat beberapa kes di mana teknik canggih seperti itu layak, tetapi selalunya anda harus menghindarinya. Menggunakan refleksi menghilangkan penaipan kuat, yang dapat memperkenalkan titik lemah dan ketidakstabilan pada kod anda. Membandingkan nama kelas dengan rentetan rentan ralat dan boleh menyebabkan perlanggaran ruang nama dengan mudah.
  • Sentiasa tentukan permukaan API dan antara muka sekecil mungkin . Putuskan komponen dan buat mereka berinteraksi di kawasan sekecil mungkin. Walaupun satu kawasan aplikasi anda dijangkiti oleh pelanggaran, yang lain akan selamat. 

Peraturan keselamatan Java # 2: Elakkan bersiri

Ini adalah satu lagi tip pengekodan, tetapi cukup penting untuk menjadi peraturan tersendiri. Serialisasi mengambil input jarak jauh dan mengubahnya menjadi objek yang dikurniakan sepenuhnya. Ini membebaskan dengan konstruktor dan pengubah akses, dan memungkinkan aliran data yang tidak diketahui menjadi kod berjalan di JVM. Akibatnya, serialisasi Java sangat tidak wujud dan tidak selamat.

Akhir siri bersiri Java

Sekiranya anda belum pernah mendengar, Oracle mempunyai rancangan jangka panjang untuk membuang siri dari Java. Mark Reinhold, ketua arkitek kumpulan platform Java di Oracle, mengatakan bahawa dia percaya sepertiga atau lebih dari semua kerentanan Java melibatkan serialisasi.

Seboleh-bolehnya, elakkan siri / deserialisasi dalam kod Java anda. Sebaliknya, pertimbangkan untuk menggunakan format bersiri seperti JSON atau YAML. Jangan sekali-kali mendedahkan titik akhir rangkaian yang tidak dilindungi yang menerima dan bertindak semasa aliran bersiri. Ini hanyalah tikar selamat datang untuk kekacauan.

Peraturan keselamatan Java # 3: Jangan sekali-kali mendedahkan kelayakan atau PII yang tidak disulitkan

Sukar untuk dipercayai, tetapi kesalahan yang dapat dielakkan ini menimbulkan rasa sakit dari tahun ke tahun.

Apabila pengguna memasukkan kata laluan ke dalam penyemak imbas, kata sandi dikirim sebagai teks biasa ke pelayan anda. Itu adalah kali terakhir ia melihat cahaya hari. Anda mesti menyulitkan kata laluan melalui cypher sehala sebelum memasukkannya ke pangkalan data, dan kemudian melakukannya sekali lagi jika dibandingkan dengan nilai tersebut.

Peraturan untuk kata laluan berlaku untuk semua maklumat yang dapat dikenal pasti secara peribadi (PII): kad kredit, nombor keselamatan sosial, dan lain-lain. Segala maklumat peribadi yang dipercayakan kepada aplikasi anda harus ditangani dengan tahap penjagaan yang tinggi.

Kredensial yang tidak disulitkan atau PII dalam pangkalan data adalah lubang keselamatan yang ternganga, menunggu penyerang menemui. Begitu juga, jangan sekali-kali menulis kelayakan mentah ke log, atau menghantarnya ke fail atau rangkaian. Sebaliknya, buat hash masin untuk kata laluan anda. Pastikan anda membuat penyelidikan dan gunakan algoritma hash yang disyorkan.

Melompat ke Peraturan # 4: selalu gunakan perpustakaan untuk penyulitan; jangan gulung sendiri.

Peraturan keselamatan Java # 4: Gunakan perpustakaan yang diketahui dan diuji

Perhatikan soalan dan jawapan ini mengenai penggabungan algoritma keselamatan anda sendiri. Pelajaran tl; dr adalah: menggunakan perpustakaan dan kerangka kerja yang diketahui dan boleh dipercayai apabila mungkin. Ini berlaku di seluruh spektrum, dari hashing kata laluan hingga keizinan REST API.

Nasib baik, Java dan ekosistemnya menyokong anda di sini. Untuk keselamatan aplikasi, Spring Security adalah standard de facto. Ini menawarkan berbagai pilihan dan fleksibiliti agar sesuai dengan arsitektur aplikasi apa pun, dan menggabungkan berbagai pendekatan keamanan.

Naluri pertama anda dalam menangani keselamatan adalah dengan membuat kajian anda. Teliti amalan terbaik, dan kemudian selidik apa perpustakaan yang akan melaksanakan amalan tersebut untuk anda. Sebagai contoh, jika anda ingin menggunakan Token Web JSON untuk menguruskan pengesahan dan pengesahan, lihat perpustakaan Java yang merangkum JWT, dan kemudian pelajari cara mengintegrasikannya ke Spring Security.

Walaupun menggunakan alat yang boleh dipercayai, cukup mudah untuk mengesahkan kebenaran dan pengesahan. Pastikan bergerak perlahan dan periksa semula semua yang anda lakukan.

Peraturan keselamatan Java # 5: Paranoid mengenai input luaran

Sama ada dari pengguna yang menaip ke dalam bentuk, datastore, atau API jauh, tidak pernah mempercayai input luaran.

SQL injection dan cross-site scripting (XSS) hanyalah serangan yang paling umum diketahui yang boleh disebabkan oleh kesalahan memasukkan input luaran. Contoh yang kurang dikenali - salah satu dari banyak - adalah "serangan ketawa bilion", di mana pengembangan entiti XML dapat menyebabkan serangan Penolakan Perkhidmatan.

Bila-bila masa anda menerima input, itu mesti diperiksa dan dibersihkan. Hal ini berlaku terutamanya untuk apa sahaja yang mungkin ditunjukkan kepada alat atau sistem lain untuk diproses. Sebagai contoh, jika sesuatu dapat berakhir sebagai hujah untuk baris perintah OS: berhati-hatilah!

Contoh khas dan terkenal ialah suntikan SQL, yang diliputi dalam peraturan seterusnya.

Peraturan keselamatan Java # 6: Sentiasa gunakan pernyataan yang disiapkan untuk menangani parameter SQL

Bila-bila masa anda membuat pernyataan SQL, anda berisiko menyisipkan serpihan kod yang boleh dilaksanakan.

Mengetahui hal ini, adalah amalan yang baik untuk selalu menggunakan kelas java.sql.PreparedStatement untuk membuat SQL. Kemudahan serupa ada untuk kedai NoSQL seperti MongoDB. Sekiranya anda menggunakan lapisan ORM, pelaksanaannya akan menggunakan PreparedStatements untuk anda di bawah tudung.

Peraturan keamanan Java # 7: Jangan mengungkapkan implementasi melalui pesan kesalahan

Mesej ralat dalam pengeluaran boleh menjadi sumber maklumat yang subur bagi penyerang. Jejak tumpukan, terutamanya, dapat mengungkapkan maklumat mengenai teknologi yang anda gunakan dan bagaimana anda menggunakannya. Elakkan mendedahkan jejak timbunan kepada pengguna akhir.

Makluman log masuk yang gagal juga termasuk dalam kategori ini. Umumnya diterima bahawa pesan kesalahan harus diberikan sebagai "Login gagal" berbanding "Tidak menemui pengguna itu" atau "Kata laluan yang salah." Tawarkan sedikit sebanyak bantuan kepada pengguna yang berpotensi jahat.

Sebaik-baiknya, mesej ralat tidak boleh mendedahkan timbunan teknologi yang mendasari aplikasi anda. Simpan maklumat itu sekerap mungkin.

Peraturan keselamatan Java # 8: Pastikan pelepasan keselamatan dikemas kini

Pada tahun 2019, Oracle telah melaksanakan skema pelesenan baru dan jadual pelepasan untuk Java. Malangnya bagi pembangun, irama pelepasan baru tidak menjadikan semuanya lebih mudah. Walaupun begitu, anda bertanggungjawab untuk kerap memeriksa kemas kini keselamatan dan menggunakannya pada JRE dan JDK anda.

Pastikan anda mengetahui tampalan kritikal apa yang tersedia dengan kerap memeriksa halaman utama Oracle untuk makluman keselamatan. Setiap suku tahun, Oracle menyampaikan kemas kini patch automatik untuk pelepasan Java LTS (sokongan jangka panjang) semasa. Masalahnya, patch itu hanya tersedia jika anda membayar lesen sokongan Java.

Sekiranya organisasi anda membayar lesen seperti itu, ikuti laluan kemas kini automatik. Sekiranya tidak, anda mungkin menggunakan OpenJDK, dan anda perlu melakukan penambaikan sendiri. Dalam kes ini, anda boleh menggunakan patch binari, atau anda boleh mengganti pemasangan OpenJDK yang ada dengan versi terbaru. Sebagai alternatif, anda boleh menggunakan OpenJDK yang disokong secara komersial seperti Azul's Zulu Enterprise.

Adakah anda memerlukan setiap patch keselamatan?

Sekiranya anda memerhatikan amaran keselamatan dengan teliti, anda mungkin mendapati anda tidak memerlukan satu set kemas kini yang diberikan. Sebagai contoh, pelepasan Januari 2020 nampaknya merupakan kemas kini Java yang kritikal; namun, pembacaan dekat menunjukkan bahawa kemas kini hanya menambal lubang dalam keamanan applet Java, dan tidak mempengaruhi pelayan Java.

Peraturan keselamatan Java # 9: Cari kerentanan ketergantungan

Terdapat banyak alat yang tersedia untuk mengimbas pangkalan kod anda secara automatik dan bergantung kepada kelemahan. Yang mesti anda buat hanyalah menggunakannya.

OWASP, Open Web Application Security Project, adalah organisasi yang didedikasikan untuk meningkatkan keselamatan kod. Senarai alat pengimbas kod automatik berkualiti tinggi yang dipercayai OWASP merangkumi beberapa alat berorientasikan Java.

Periksa pangkalan data anda dengan kerap, tetapi juga perhatikan kebergantungan pihak ketiga. Penyerang menyasarkan perpustakaan sumber terbuka dan tertutup. Perhatikan kemas kini kebergantungan anda, dan kemas kini sistem anda kerana pembaikan keselamatan baru dilepaskan.

Peraturan keselamatan Java # 10: Pantau dan log aktiviti pengguna

Bahkan serangan kekerasan sederhana boleh berjaya jika anda tidak memantau aplikasi anda secara aktif. Gunakan alat pemantauan dan pembalakan untuk mengawasi kesihatan aplikasi.

Sekiranya anda ingin yakin mengapa pemantauan itu penting, hanya duduk dan menonton paket TCP di port mendengar aplikasi anda. Anda akan melihat semua jenis aktiviti, selain interaksi pengguna yang sederhana. Sebahagian daripada aktiviti tersebut adalah bot dan orang jahat yang mencari kelemahan.

Anda harus membuat pembalakan dan pemantauan untuk percubaan masuk yang gagal dan menerapkan langkah-langkah balas untuk mengelakkan klien jauh menyerang tanpa hukuman.

Pemantauan dapat memberi peringatan kepada anda mengenai lonjakan yang tidak dapat dijelaskan, dan pembalakan dapat membantu membongkar apa yang salah setelah serangan. Ekosistem Java merangkumi banyak penyelesaian komersial dan sumber terbuka untuk pembalakan dan pemantauan.

Peraturan keselamatan Java # 11: Awas serangan Denial of Service (DoS)

Bila-bila masa anda memproses sumber yang berpotensi mahal atau melakukan operasi yang berpotensi mahal, anda harus berhati-hati terhadap penggunaan sumber yang melarikan diri.

Oracle menyimpan senarai vektor yang berpotensi untuk jenis masalah ini dalam Pedoman Pengekodan Selamat untuk dokumen Java SE, di bawah tajuk "Penolakan Perkhidmatan".

Pada asasnya, bila-bila masa anda melakukan operasi yang mahal, seperti membuka zip fail yang dimampatkan, anda harus memantau penggunaan sumber yang meletup. Jangan mempercayai manifes fail. Percayakan hanya penggunaan cakera atau dalam memori sebenar, pantau dan jaga-jaga daripada berlakunya keterlaluan.

Begitu juga, dalam beberapa pemprosesan, penting untuk memerhatikan gelung selamanya yang tidak dijangka. Sekiranya gelung disyaki, tambahkan pengawal yang memastikan gelung itu maju dan litar pintas jika nampaknya zombie telah hilang.

Peraturan keselamatan Java # 12: Pertimbangkan untuk menggunakan pengurus keselamatan Java

Java mempunyai pengurus keselamatan yang dapat digunakan untuk membatasi sumber daya yang dapat diakses oleh proses yang sedang berjalan. Ini dapat mengasingkan program berkenaan dengan akses cakera, memori, rangkaian, dan JVM. Mengecilkan syarat ini untuk aplikasi anda mengurangkan kesan bahaya yang mungkin berlaku akibat serangan. Pengasingan seperti itu juga dapat menyusahkan, oleh sebab SecurityManageritu tidak diaktifkan secara lalai.

Anda harus memutuskan sendiri sama ada SecurityManagerpendapat yang bernas sesuai dengan lapisan perlindungan tambahan untuk aplikasi anda. Lihat dokumen Oracle untuk mengetahui lebih lanjut mengenai sintaks dan keupayaan pengurus keselamatan Java.

Peraturan keselamatan Java # 13: Pertimbangkan untuk menggunakan perkhidmatan pengesahan awan luaran

Sebilangan aplikasi mesti memiliki data pengguna mereka; selebihnya, penyedia perkhidmatan awan boleh masuk akal.

Cari di sekitar dan anda akan menemui pelbagai penyedia pengesahan awan. Manfaat perkhidmatan sedemikian adalah bahawa penyedia bertanggungjawab untuk melindungi data pengguna sensitif, bukan anda. Sebaliknya, menambahkan perkhidmatan pengesahan meningkatkan kerumitan seni bina syarikat anda. Beberapa penyelesaian, seperti FireBase Authentication, termasuk SDK untuk mengintegrasikan di seluruh timbunan.

Kesimpulannya

Saya telah mengemukakan 13 peraturan untuk mengembangkan aplikasi Java yang lebih selamat. Peraturan ini dicuba-dan-benar, tetapi peraturan yang paling besar adalah ini: curiga. Sentiasa mendekati pengembangan perisian dengan kehati-hatian dan pandangan keselamatan. Cari kelemahan dalam kod anda, manfaatkan API dan pakej keselamatan Java, dan gunakan alat pihak ketiga untuk memantau dan mencatat kod anda untuk masalah keselamatan.

Berikut adalah tiga sumber tahap tinggi yang baik untuk terus mengikuti landskap keselamatan Java yang selalu berubah:

  • 10 OWASP Teratas
  • 25 Terbaik CWE
  • Garis Panduan Kod Selamat Oracle

Kisah ini, "Tiga belas peraturan untuk mengembangkan aplikasi Java yang aman" awalnya diterbitkan oleh JavaWorld.