Yerel kod kullanımı

OWASP kategorisi: MASVS-CODE: Kod Kalitesi

Genel Bakış

Android uygulamaları, belirli işlevler için C ve C++ gibi dillerde yazılmış yerel kodlardan yararlanabilir. Ancak bir uygulama, bu yerel kodla etkileşim kurmak için Java Native Interface'i (JNI) kullandığında arabellek taşması gibi güvenlik açıklarına ve yerel kod uygulamasında bulunabilecek diğer sorunlara maruz kalabilir.

Etki

Performans optimizasyonu ve karartma gibi çok olumlu etkileri olmasına rağmen Android uygulamalarında yerel kod kullanmak güvenlik açısından olumsuz etkilere neden olabilir. C/C++ gibi yerel kod dillerinde Java/Kotlin'deki bellek güvenliği özellikleri bulunmadığından bu diller, arabellek taşması, boşaltıldıktan sonra kullanım hataları ve diğer bellek bozulması sorunları gibi güvenlik açıklarına karşı savunmasızdır. Bu durum, kilitlenmelere veya rastgele kod yürütülmesine yol açar. Ayrıca, yerel kod bileşeninde bir güvenlik açığı varsa geri kalanı Java'da güvenli bir şekilde yazılmış olsa bile tüm uygulama tehlikeye girebilir.

Çözümler

Geliştirme ve kodlama kılavuzu

  • Güvenli Kodlama Kuralları: C/C++ projelerinde arabellek taşması, tam sayı taşması ve biçim dizesi saldırıları gibi güvenlik açıklarını azaltmak için yerleşik güvenli kodlama standartlarına (ör. CERT, OWASP) uyun. Kalite ve güvenlik açısından bilinen Abseil gibi kitaplıklara öncelik verin. Mümkün olduğunda, C/C++ ile karşılaştırılabilir performans sunan Rust gibi bellek açısından güvenli dilleri kullanmayı düşünebilirsiniz.
  • Giriş Doğrulama: Kullanıcı girişi, ağ verileri ve dosyalar dahil olmak üzere harici kaynaklardan alınan tüm giriş verilerini, ekleme saldırılarını ve diğer güvenlik açıklarını önlemek için titizlikle doğrulayın.

Derleme seçeneklerini zorlaştırma

ELF biçimini kullanan yerel kitaplıklar, yığın koruması (Canary), yeniden konumlandırma salt okunur (RELRO), veri yürütmeyi engelleme (NX) ve konumdan bağımsız yürütülebilir dosyalar (PIE) gibi koruyucu mekanizmalar etkinleştirilerek çeşitli güvenlik açıklarına karşı güçlendirilebilir. Android NDK derleme seçenekleri, tüm bu korumaları varsayılan olarak etkinleştirir.

Bir ikili programda bu güvenlik mekanizmalarının uygulanmasını doğrulamak için hardening-check veya pwntools gibi araçları kullanabilirsiniz.

Bash

$ pwn checksec --file path/to/libnativecode.so
    Arch:     aarch64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled

Üçüncü taraf kitaplıklarının güvenlik açığı içermediğini doğrulayın.

Üçüncü taraf kitaplıklarını seçerken geliştirme topluluğunda iyi bir itibara sahip olanları kullanmaya öncelik verin. Google Play SDK Dizini gibi kaynaklar, saygın ve güvenilir kitaplıkları belirlemenize yardımcı olabilir. Kitaplıkları en son sürümlere güncellediğinizden emin olun ve Exploit-DB'nin veritabanları gibi kaynakları kullanarak bunlarla ilgili bilinen güvenlik açıklarını proaktif bir şekilde arayın. [library_name] vulnerability veya [library_name] CVE gibi anahtar kelimelerle yapılan bir web araması, önemli güvenlik bilgilerini ortaya çıkarabilir.

Kaynaklar