10 puan yazan GN⁺ 2024-11-05 | 1 yorum | WhatsApp'ta paylaş
  • Go kodu yazarken güvenliği dikkate almak karmaşık bir iştir
  • Sürekli uygulandığında sağlam, güvenli ve yüksek performanslı kod yazmaya yardımcı olabilecek birkaç somut pratik sunuluyor

Go sürümünü güncel tutmak

  • Projede kullanılan Go sürümü güncel tutulmalıdır
  • En yeni dil özellikleri kullanılmasa bile Go sürümünü yükseltmek, keşfedilmiş açıklar için tüm güvenlik yamalarını almayı sağlar
  • Yeni Go sürümleri ayrıca en güncel bağımlılıklarla uyumluluğu da garanti eder
  • Go release history sitesinden hangi Go sürümünde hangi güvenlik sorunlarının ve CVE'lerin giderildiğini kontrol edip projenin go.mod dosyasında en yeni sürüme güncelleme yapabilirsiniz
  • Go sürümünü yükselttikten sonra uyumluluk ve bağımlılık sorunları oluşmadığından emin olunmalıdır
  • Kod kalitesini ve güvenliği değerlendirmek için statik kod analiz araçları kullanılabilir

vet

  • Go'nun kendi sağladığı go vet komutuyla Go kodu analiz edilebilir
  • go vet komutu argümansız çalıştırıldığında varsayılan olarak izin verilen tüm seçeneklerle çalışır
  • Kaynak kodu tarar ve olası sorunları bildirir
  • En yaygın sorunlar arasında goroutine hataları, kullanılmayan değişkenler ve ulaşılamayan kod bölgeleri bulunur

staticcheck

  • Üçüncü taraf linter Staticcheck, hataları bulur, performans problemlerini tespit eder ve Go dilinin stilini de uygular
  • Bulduğu sorunları açıklar ve örneklerle birlikte düzeltme önerileri sunar
  • CI pipeline'ında çalıştırmanın yanı sıra bağımsız bir çalıştırılabilir dosya olarak kurulup yerelde kod taraması için de kullanılabilir
  • Kurulu sürümü kontrol edin ve taramayı çalıştırmaya hazır olduğundan emin olun
  • Argümansız çalıştırıldığında varsayılan olarak tüm kod analizörlerini çağırır
  • NGINX Agent GitHub deposunda neler bulunabileceğine dair bir örneğe bakın
  • Tarama sonuçları deprecated paketler/metotlar/fonksiyonlar, kullanılmayan değişkenler/alanlar ve kod kalitesiyle ilgili sorunlar olmak üzere 3 kategoriye ayrılabilir

golangci-lint

  • golangci-lint, go install komutuyla kurulabilir
  • Kurulumun düzgün yapıldığını doğrulamak için sürümü kontrol edin
  • Argümansız çağrıldığında tüm linter'lar çalıştırılır
  • Daha önce klonlanan agent deposunda hangi uyarıları ve önerileri gösterdiğini kontrol edin
  • Linter tam dosyayı ve satırı işaret eder
  • Kodu değerlendirin ve değiştirin, ardından linter'ı yeniden çalıştırın ve tüm birim testlerini çalıştırın
  • Testler geçerse güncellenen kodu commit edin ve uzak depoya push edin

Race condition tespiti

  • Birden fazla goroutine aynı anda bir kaynağa erişmeye çalıştığında race condition oluşabilir
  • En az bir goroutine kaynağı değiştirmeye çalıştığında bu durum tespit edilir
  • Go, test aracıyla birlikte -race argümanını kullanarak bu durumları test etmeyi varsayılan olarak destekler
  • Race detector yalnızca çalıştırılan kodu değerlendirir ve çalıştırılmayan kod yollarını yok sayar; bu yüzden önce ölü kod olmadığını doğrulamak için statik kod analiz araçları çalıştırılmalıdır
  • Testleri paralel çalıştırmak, eşzamanlılık sorunlarını tespit etme olasılığını artırır

Açıklar için kaynak kod taraması

govulncheck

  • Kod tabanını CVE'ler veritabanında listelenen bilinen açıklar için tarayan bir araçtır
  • Go ekibi tarafından geliştirilir ve tarayıcıya Go açıklarına özel bir veritabanı bilgi sağlar
  • En son sürümü kurduktan sonra temel işlevleri deneyin
  • habit deposunu klonladıktan sonra araç kök dizinde çalıştırılır
  • Herhangi bir açık bulunmaz
  • İkili dosya tarandığında farklı açıklar bulunabilir
  • Go sürümünü en yeni sürüme yükseltin, bağımlılıkları çekin ve ardından yazılımda ve bağımlılıklarda CVE bulunmadığını doğrulayın

gosec

  • Güvensiz kod yapılandırmalarını bulmaya yardımcı olan bir statik kod analiz aracıdır
  • Yerel sistemde veya GitHub Action ile CI pipeline'ında çalıştırılabilir
  • Tarama yapılandırması için çeşitli seçenekler ve kural listeleri vardır
  • Taranacak Go kodunu içeren GitHub deposu klonlandıktan sonra kök dizinde tarama başlatılır
  • Tarama raporunda ciddiyet ve güven düzeyine göre sıralanmış potansiyel sorunların listesi görülebilir
  • Raporlanan CWE'leri inceleyin ve listelenen zafiyetler hakkında daha ayrıntılı bilgi edinin

Fuzzing

  • Kod kalitesini doğrulamanın ve açıkları bulmanın son yöntemidir
  • Kod test kapsamını kullanarak rastgele üretilen giriş verilerini işleyen otomatikleştirilmiş özel testlerdir
  • Buffer overflow, SQL injection, DoS saldırıları ve XSS saldırıları gibi potansiyel güvenlik kusurlarını bulmada çok faydalıdır
  • Çok sayıda giriş kombinasyonu otomatik olarak üretildiği için geliştiricilerin yüzlerce, binlerce veri kombinasyonunu tek tek düşünmesi gerekmez

1 yorum

 
GN⁺ 2024-11-05
Hacker News görüşü
  • govulncheck, güvenlik açığı içeren koda gerçekten ulaşılıp ulaşılmadığını doğrulayan bir araç olduğundan, programın bağımlılıklarını denetlemekten daha yararlıdır
  • Google'ın capslock projesini unutmamak ve ona da bakmak gerekir
  • go vet ve go test -race hakkında faydalı ipuçları içeriyor
  • Go bellek açısından güvenli değil, ancak diğer dillere kıyasla daha güvenli kod yazmayı kolaylaştırıyor
    • Go'nun açık sözdizimi sayesinde bir fonksiyonun davranışını ve veri yapılarını anlamak kolaydır
    • Yapay zeka araçlarının Go ile iyi çalışmasının nedeni, fonksiyon içindeki bağlamın net olmasıdır
  • Semgrep, statik analiz yoluyla diller ve yaygın framework'ler için kontroller yapan mükemmel bir araçtır
    • Semgrep'in açık kurallarına GitHub üzerinden bakılabilir
  • Go'nun güvenlik itibarı hakkında soru işaretleri dile getiriliyor
    • Go'nun genel olarak güvenli ve kararlı olduğu, .NET gibi diğer araçlarla benzer seviyede bulunduğu düşünülüyor
  • gosec hakkında yeni bilgi edinildi
  • 9 yıl boyunca Go uygulamalarını bakımda tutarken Go sürümlerini ve modülleri kolayca yükseltmek mümkün oldu
    • GitHub güvenlik açıklarını otomatik olarak bildiriyor ve vakaların %99'unda hiçbir değişiklik yapmadan çalışıyor
  • Go aslında bellek güvenli değil
    • Atomiklik yalnızca makine sözcüğü boyutundaki değerler için garanti edilir; arayüz işaretçileri veya slice gibi çift sözcüklü değerler eşzamanlılıkta bellek güvenliğini bozabilir
  • Go iyi bir dil, ancak son dönemde generics kullanımının artmasıyla kod okunabilirliği düşüyor
    • Önceden generics'in neredeyse hiç kullanılmadığı Go koduna kıyasla okumak daha zor hale geliyor