10 poin oleh GN⁺ 2024-11-05 | 1 komentar | Bagikan ke WhatsApp
  • Mempertimbangkan keamanan saat menulis kode Go merupakan pekerjaan yang kompleks
  • Dengan menyajikan beberapa praktik konkret dan menerapkannya secara konsisten, hal ini membantu menulis kode yang tangguh, aman, dan berkinerja tinggi

Menjaga versi Go tetap terbaru

  • Versi Go yang digunakan dalam proyek harus dijaga tetap terbaru
  • Meskipun tidak menggunakan fitur bahasa terbaru, menaikkan versi Go tetap memungkinkan Anda menerima semua patch keamanan untuk kerentanan yang telah ditemukan
  • Versi Go yang baru juga menjamin kompatibilitas dengan dependensi terbaru
  • Di situs riwayat rilis Go, Anda dapat memeriksa isu keamanan dan CVE apa yang diperbaiki di setiap rilis Go, lalu memperbarui ke versi terbaru di file go.mod proyek
  • Setelah meng-upgrade versi Go, Anda harus memastikan tidak ada masalah kompatibilitas maupun dependensi
  • Anda dapat menggunakan penganalisis kode statis untuk mengevaluasi kualitas dan keamanan kode

vet

  • Kode Go dapat dianalisis dengan perintah bawaan Go, go vet
  • Jika dijalankan tanpa argumen, perintah go vet akan berjalan dengan semua opsi yang diizinkan secara default
  • Alat ini memindai source code dan melaporkan potensi masalah
  • Masalah yang paling umum meliputi kesalahan goroutine, variabel yang tidak digunakan, dan area kode yang tidak dapat dijangkau

staticcheck

  • Staticcheck, linter pihak ketiga, dapat menemukan bug, mendeteksi masalah performa, dan juga menerapkan gaya bahasa Go
  • Alat ini menjelaskan masalah yang ditemukan dan menyarankan perbaikan beserta contoh
  • Selain dijalankan di pipeline CI, alat ini juga dapat diinstal sebagai executable mandiri untuk memindai kode secara lokal
  • Periksa versi yang terpasang dan pastikan siap menjalankan pemindaian
  • Jika dijalankan tanpa argumen, secara default alat ini akan memanggil semua penganalisis kode
  • Lihat contoh apa yang dapat ditemukan di repositori GitHub NGINX Agent
  • Hasil pemindaian dapat diklasifikasikan menjadi tiga jenis: package/metode/fungsi deprecated, variabel/field yang tidak digunakan, dan masalah terkait kualitas kode

golangci-lint

  • golangci-lint dapat diinstal dengan perintah go install
  • Periksa versinya untuk memastikan instalasi berhasil
  • Jika dipanggil tanpa argumen, semua linter akan dijalankan
  • Periksa peringatan dan saran apa yang ditampilkan pada repositori agent yang telah di-clone sebelumnya
  • Linter akan menunjuk file dan baris yang tepat
  • Evaluasi dan ubah kode, lalu jalankan kembali linter dan seluruh unit test
  • Jika test lolos, commit kode yang telah diperbarui lalu push ke remote

Mendeteksi race condition

  • Race condition dapat terjadi ketika beberapa goroutine mencoba mengakses resource secara bersamaan
  • Kondisi ini terdeteksi ketika setidaknya satu goroutine mencoba mengubah resource
  • Go secara bawaan mendukung pengujian kondisi ini dengan menggunakan alat test bersama argumen -race
  • Race detector hanya mengevaluasi kode yang benar-benar dijalankan dan mengabaikan jalur kode yang tidak dieksekusi, jadi sebaiknya jalankan penganalisis kode statis terlebih dahulu untuk memastikan tidak ada dead code
  • Menjalankan test secara paralel meningkatkan kemungkinan mendeteksi masalah konkurensi

Memindai source code untuk kerentanan

govulncheck

  • Alat untuk memindai code base terhadap kerentanan yang telah diketahui dan terdaftar di database CVEs
  • Dikembangkan oleh tim Go, dan database khusus kerentanan Go menyediakan informasi untuk scanner ini
  • Setelah memasang versi terbaru, coba fungsi dasarnya
  • Clone repositori habit lalu jalankan alat dari direktori root
  • Tidak ditemukan kerentanan
  • Jika memindai file biner, kerentanan lain mungkin dapat ditemukan
  • Upgrade versi Go ke yang terbaru, ambil dependensi, lalu periksa apakah software dan dependensinya bebas dari CVE

gosec

  • Penganalisis kode statis yang membantu menemukan konfigurasi kode yang tidak aman
  • Dapat dijalankan di sistem lokal maupun di pipeline CI sebagai GitHub Action
  • Tersedia berbagai opsi dan daftar aturan untuk konfigurasi pemindaian
  • Clone repositori GitHub yang berisi kode Go yang akan dipindai, lalu mulai pemindaian dari direktori root
  • Pada laporan pemindaian, Anda dapat melihat daftar potensi masalah yang diurutkan berdasarkan tingkat keparahan dan tingkat kepercayaan
  • Periksa CWE yang dilaporkan dan pelajari detail lebih lanjut tentang kelemahan yang tercantum

Fuzzing

  • Metode terakhir untuk memeriksa kualitas kode dan menemukan kerentanan
  • Pengujian khusus otomatis yang memanipulasi data input yang dihasilkan secara acak dengan memanfaatkan cakupan test kode
  • Sangat berguna untuk menemukan potensi cacat keamanan seperti buffer overflow, SQL injection, serangan DoS, dan serangan XSS
  • Karena banyak kombinasi input dibuat secara otomatis, developer tidak perlu memikirkan sendiri ratusan atau ribuan kombinasi data input

1 komentar

 
GN⁺ 2024-11-05
Opini Hacker News
  • govulncheck adalah alat untuk memeriksa apakah kode yang rentan benar-benar dapat dijangkau, sehingga lebih berguna daripada sekadar memeriksa dependensi program
  • Perlu diingat untuk merujuk juga ke proyek capslock dari Google
  • Termasuk tips berguna tentang go vet dan go test -race
  • Go tidak aman terhadap memori, tetapi lebih mudah menulis kode yang aman dibandingkan bahasa lain
    • Berkat sintaks Go yang jelas, perilaku fungsi dan struktur data dapat dipahami dengan mudah
    • Alasan alat AI bekerja baik dengan Go adalah karena konteks di dalam fungsi jelas
  • Semgrep adalah alat yang sangat baik untuk melakukan pemeriksaan terhadap bahasa dan framework umum melalui analisis statis
    • Aturan terbuka Semgrep dapat dilihat di GitHub
  • Muncul pertanyaan tentang reputasi keamanan Go
    • Go umumnya dianggap aman dan stabil, dan berada di tingkat yang mirip dengan alat lain seperti .NET
  • Baru mengetahui tentang gosec
  • Selama 9 tahun memelihara aplikasi Go, versi Go dan modul dapat di-upgrade dengan mudah
    • GitHub secara otomatis memberi tahu tentang kerentanan, dan dalam 99% kasus tetap berjalan tanpa perubahan
  • Go sebenarnya tidak aman terhadap memori
    • Atomisitas hanya dijamin untuk nilai seukuran word, dan nilai dua-word seperti pointer interface atau slice dapat merusak keamanan memori dalam konkurensi
  • Go bagus, tetapi belakangan keterbacaan kode menurun karena penggunaan generic meningkat
    • Menjadi lebih sulit dibaca dibandingkan kode Go sebelumnya yang hampir tidak menggunakan generic