Kıdemli Geliştirici İlişkileri Mühendisi
Bu sunuda, yapay zekayı genel bir kodlama asistanı olarak görmekten, doğrudan Android geliştirme yaşam döngüsüne entegre edilmiş, bağlama duyarlı ve otomatik bir güvenlik akran inceleme uzmanı olarak kullanmaya yönelik stratejik geçiş ele alınmaktadır. Beceriler aracılığıyla Android araç zincirine bağlı özel yapay zeka temsilcilerinin uygulama güvenliğini artırmaya nasıl yardımcı olabileceğini ele alıyoruz. Bu yaklaşım, ham LLM özellikleri ile derin proje bağlamı arasındaki boşluğu doldurarak geliştirme ekiplerinin katı güvenlik ve politika standartlarından ödün vermeden yüksek hızda özellik sunmasını sağlar.
Transkript
Merhaba, ben Kristen.
Merhaba, ben de Sabs.
Bugün sizinle temsilci çağında güvenlik hakkında konuşacağız.
Geçtiğimiz yıl, Android Bug Hunters programı için 2 milyon ABD dolarından, mobil için ise 200 bin ABD dolarından fazla ödül verdik.
Temsilci çağında uygulama güvenliği sürekli olarak gelişiyor.
Bu sorunları hızlı ve etkili bir şekilde çözmemize yardımcı olacak araçlardan bahsedelim.
Temsilcilerin Android güvenliğiyle ilgili performansını artırmak için daha iyi bir istem kullanmak yeterli değildir.
Temsilcilerin, uygulamanızın güvenliğini sağlamak için araç zincirlerimizi ve API'mizi anlamasına yardımcı olan araçlar ve iş akışlarıdır.
Saat 16:30.
Perşembe günü.
Bir sürüm yayınlıyorsunuz ve CI kırmızıya dönüyor. Tek bir hata var: Yayın alıcı, dışa aktarma işareti olmadan kaydedilmiş.
Dolayısıyla, ister her işi yapan küçük bir ekipte ister sürümü yayınlarken güvenlik kontrollerinin yapıldığı büyük bir ekipte olun, gerçek aynıdır.
Bizler yüksek kaliteli özellikleri hızlı bir şekilde sunan ürün mühendisleriyiz, güvenlik araştırmacısı değiliz.
Peki, doğal içgüdü nedir?
Bu uyarıyı bir temsilci araca iletir ve temsilciden düzeltme yapmasını isteriz.
Ancak temsilci araç, projenizin bağlamı olmadan çalıştığı için üç kör noktası vardır.
Uygulamanızın dinamik özellik modüllerinden veya çoklu APK paketlerinden oluşturulduğunu bilmeyebilir.
Sevk edilen bir yapı değil, bir dosya görür.
Kotlin kullanıcı arayüzünüzden KMP paylaşılan mantığınıza ve yerel C++ JNI çağrılarına kadar olan veri akışını izleyemeyebilir.
Yalnızca bir katman görür.
Son olarak, minimum SDK'nız veya Gradle derleme varyantlarınız hakkında bilgi sahibi olmayabilir.
Bu nedenle, bir temsilciyi uygulamaya yönlendirdik ve güvenlik denetimi istedik.
Altı bulgu döndürüldü.
Şimdi asıl konuya gelelim.
Her biri doğru.
Bunlar savunulabilir ancak bunlardan yalnızca biri aslında başladığımız hatadır.
Geri kalanı ise iyi uygulamalar, daha fazla araştırılması gereken konular, tahminler ve geçerli bile olmayabilecek şeylerin bir karışımıdır.
Şimdi bunu daha fazla uyarı içeren gerçek bir kod tabanına ölçeklendirdiğinizde her pull isteğinde lint'i bastırmaya yöneleceksiniz.
Bu değişikliğin birleştirilmesi için değişiklik yapmanız gerekir, hatta bir güvenlik açığını tamamen gözden kaçırabilirsiniz.
Gerçek güvenlik açıkları da bu şekilde gözden kaçar.
Araç dikkatsiz değil, dikkatliydi ancak dikkatli olmak, faydalı olmakla aynı şey değil.
Bunu somutlaştıralım.
Örneğin, temsilcinize "Bu uygulamadaki dışa aktarılan her bileşeni uygulama intent'i yönlendirmesi açısından denetle" diyebilirsiniz.
Bu, gerçek bir güvenlik görevidir ve çok modüllü bir uygulamada büyük bir görevdir.
Maliyetin gerçekten ortaya çıktığı istek türü budur.
Android'e özel bir rehberlik olmadan temsilcinin bu soru için bir stratejisi yoktur.
Yani kaba kuvvet saldırısı yapar.
Hiçbir şey dışa aktarmayan modülleri okuyabilir.
Bir intent yönlendirmesini kötüye kullanılabilir kılan şeyin ne olduğunu ilk ilkeden yeniden türetebilir.
Daha önce erişilemeyen yolları izleyebilir.
Analiz için değil, keşif için ödeme yapıyorsunuz.
Eksik stratejiyi tamamlayan şey beceridir.
Örneğin, Android güvenlik becerileri, temsilcinize mevcut kılavuzlara uygun talimatlar ve bir güvenlik araştırmacısının izleyeceği adımların aynısını sağlar. Böylece temsilci tahmin yürütmeyi bırakır.
Kurallar beceri tarafından sağlandığı için kuralları yeniden keşfetmez.
Şu anda iki güvenlik becerisi kullanıma sunulmuştur: Intent Security ve Permissions.
Intent güvenliği, diğer uygulamaların uygulamanıza neler yaptırabileceğiyle ilgilidir.
Uygulamanızda, diğer uygulamalarda olmayan izinler ve oturum açma oturumu vardır.
Bu nedenle, dışa aktarılan her bileşen ve verdiğiniz her beklemede olan intent, birinin sizin aracılığınızla işlem yapması için potansiyel bir yoldur.
Bu beceri, bu tür durumlara karşı korunmaya yardımcı olur.
İzin becerisi, beyan edilen bir izin ile gerçekte uygulanan bir izin arasındaki boşluğu kapatmaya yardımcı olur.
Uygun izin kontrolünü yazmanıza yardımcı olabilir.
Joker karakter yolu olan bir sağlayıcının tek bir dizin yerine tüm veritabanına erişim izni verip vermediğini belirlemeye yardımcı olur.
Ayrıca gereğinden fazla izin isteyen uygulamaları da tespit eder.
Örneğin, fotoğraf seçicinin yeterli olacağı durumlarda geniş kapsamlı erişim istemek.
Android KSA ile kullanın ve "Intent güvenliği için denetle" deyin.
Yapılandırma yok.
Kural ayarı yok.
Bu sayede, çıktıda çok sayıda uyarı gösterilmez.
Bu bir yorumdur.
İşte bir hata, uygulamanız için neden önemli olduğu ve düzeltmesi.
Uzman ipucuna bakalım.
Android KSA'yı kullanarak kolayca bulup yükleyebilirsiniz.
android skills list
android skills add android-intent-security
android skills add android-permissions-securityBeceri, projenizde tam olarak neye bakacağını bildiği için uygulamanızı gerçekte olduğu gibi görür.
Minimum SDK'nıza uyar. Böylece düzeltme, gerçek dosya yolları ve gerçek satır numaralarıyla derlenir.
Geri aldığınız yorumu aşağıda görebilirsiniz.
Tam olarak ilgili dosyayı ve satırı gösterir, gerçek tehdidi ve değişikliğin nedenini açıklar. Sadece Lint'in öyle söylediğini belirtmez.
Kullandığı beceriyi belirtir.
Derleme yapılandırmasını okudu, minimum SDK 26'yı gördü ve ContextCompat'i seçti. Böylece düzeltme çalışır ve uygulayabilmeniz için size bir fark sunar.
Bu, başta gösterdiğimiz uyarıdır ancak şimdi önerilen bir düzeltme ve ek gerekçe içerir.
Önceki beceriler güvenlik hatalarını yakalar.
Şimdi başka bir konudan, uygulama politikası uyumluluğundan bahsedelim.
Örneğin, Play Store'da uygulama yayınlamak isteyen yeni bir uygulama geliştirici olduğunuzu varsayalım.
Veri Güvenliği Formu'nu doldurmak, uygulamanızı kullanıma sunma sürecinde önemli bir adımdır. Bu nedenle, uygulama gönderilmeden önce bu formu doğru şekilde doldurduğumuzdan emin olmak için elimizdeki tüm araçları kullanalım.
Google Play politikası becerisi, kod tabanınızda statik analiz gerçekleştirir.
Mevcut bir Play Store uygulamasını yayınlıyorsanız bu statik kod analizini Play Store beyanlarıyla da karşılaştırabilir.
Bu beceriyi çalıştırarak olası Google Play politika sorunlarını uygulama gönderildikten sonra değil, gönderilmeden önce tespit edebilir ve gönderim sürecinizi hızlandırabilirsiniz.
İş akışı, daha önce ele aldığımız diğer becerilere benzer: İçe aktarın ve ardından "Göndermeden önce bu uygulamayı Google Play politika uygunluğu açısından denetle" deyin.
Sağda örnek bir raporun ekran görüntüsünü, aşağıda ise raporu yüklemek için gereken Android KSA komutlarını görebilirsiniz.
android skills list
android skills add play-policy-insightsŞimdiye kadar bahsettiğimiz her şey, uygulamanızı yayınlamadan önce gerçekleşir: intent'leri denetleme, izinleri kontrol etme, uygunluğu doğrulama.
Bu, derleme zamanı güvenliğidir ve çok önemlidir.
Ancak APK'nız kullanıma sunulduktan sonra, kontrol edemediğiniz cihazlarda çalışırken ortaya çıkan bir dizi tehdit vardır.
Play Integrity API, çalışma zamanında kendi kodunuzun kendisi hakkında yanıtlayamayacağı üç soruyu yanıtlar: Bu, uygulamanızın orijinal, değiştirilmemiş bir derlemesi mi?
Bu uygulama orijinal bir Android cihazda mı çalışıyor?
Bu bir Google Play kullanıcı hesabı mı?
Bu nedenle, uygulama bütünlüğü, cihaz bütünlüğü ve daha fazlasıyla ilgili kararlar döndürmek için Google Play Integrity API'yi kullanabilirsiniz.
Uygulamanızı daha güvenli bir şekilde yayınlamayı daha hızlı ve kolay hale getirmenin yanı sıra uygulamanızın gelirini ve saygınlığını korumayı da kolaylaştırıyoruz.
Bu nedenle, işletmenizi sahtekarlığa ve kötüye kullanıma karşı koruyun.
Burada görebileceğiniz yeni Google Play ile korunanlar kontrol paneli; bütünlük, dağıtım ve para kazanma savunmalarınızı tek bir yerden izleyip yapılandırmanıza yardımcı olur.
Ayrıca, Play Integrity API'nin ısınma gecikmesini de azaltıyoruz. Böylece, tehditleri ve riskli cihazları daha hızlı engellemek için hızın kritik olduğu kullanıcı yolculuklarında bu kontrolleri kullanabilirsiniz.
Uygulamaların güvenliğini sağlamaya yardımcı olan Android özelliklerini ve araçlarını ele aldık. Peki ya kullanıcılarınız?
Öncelikle SMS OTP Koruması'na göz atalım.
Uygulamanız için SMS tabanlı kullanıcı doğrulamasını uygulamak ve doğrulama kodları göndermek istediğinizi varsayalım.
SMS izni, uygulamanın OTP'ler gibi hassas veriler de dahil olmak üzere mesajlaşma verilerine erişmesine olanak tanır.
Bu nedenle, uygulamanızda bunu uygulayabilmeniz için birkaç API kullanıma sunduk. Böylece, geniş SMS izinleri istemeniz gerekmez ancak doğrulama için SMS OTP kodlarını almaya devam edebilirsiniz.
SMS Retriever API, uygulamanızın geniş SMS izinleri olmadan OTP'leri otomatik olarak doğrulamasını sağlar.
Uygulamanızı tanımlayan 11 karakterlik bir karma değeri mesaja eklersiniz ve sistem size yalnızca o mesajı iletir.
Mesaj biçimini kontrol edemiyorsanız SMS User Consent API'yi kullanın.
Sistem tek seferlik bir istem gösterir.
Kullanıcı, izin ver veya reddet'e dokunur. İzin verirse bu tek mesajı alırsınız.
Yine de geniş kapsamlı SMS iznine gerek yoktur.
Bazı uygulamalar, görevleri tamamlamak için yalnızca bir kez tam konuma ihtiyaç duyabilir.
Mevcut tek seferlik izin, kullanıcı deneyimini olumsuz etkilediğinden geliştiriciler bazen bunun yerine daha geniş kapsamlı tam konum izni ister.
Konum düğmesi, uygulamaya tek seferlik tam konum erişimi vermenin kolay bir yolunu sunan bir araçtır.
Uygulama geliştiriciler tarafından özelleştirilebilen ve yerleştirilebilen bir Android kullanıcı arayüzü öğesidir.
Alfa konum düğmesi Jetpack kitaplığının ilk sürümünü Haziran ayında kullanıma sunduk.
Burada, Android manifest dosyanızda konum düğmesini etkinleştirmek için gereken izinleri görebilirsiniz.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:usesPermissionFlags="onlyForLocationButton"/>
<uses-permission android:name="android.permission.USE_LOCATION_BUTTON" />
<application
android:icon="@mipmap/ic_launcher"
android:label="LocationButtonSample"
android:theme="@style/Theme.PinPoint">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>Sistemin uzaktan oluşturma hizmeti için gereken özel USE_LOCATION_BUTTON izniyle birlikte onlyForLocationButton izin işaretini ekleyerek standart konum iznini beyan etmeniz gerekir.
Sağda ise bunu uygulamak için Jetpack kodu yer alıyor.
...
import androidx.core.locationbutton.compose.LocationButton
@Composable
fun LocationPermissionScreen(onPermissionGranted: () -> Unit, onPermissionDenied: () -> Unit) {
// Renders the secure system-trusted Location Button composable
LocationButton(
// Callback triggered when the user taps the secure button and makes a decision on the permission dialog
onPermissionResult = { isGranted ->
if (isGranted) {
onPermissionGranted()
} else {
onPermissionDenied()
}
},
...Burada bir konum düğmesi oluşturduğumuzu ve geri çağırma işlevini başlattığımızı görebilirsiniz.
Bu geri çağırma, kullanıcı konum düğmesine dokunarak iznin verilip verilmeyeceğine karar verdiğinde tetiklenir.
Gelişmiş Koruma Modu, risk altındaki veya güvenliğe önem veren kullanıcılarınız için tasarlanmış bir özelliktir ancak dileyen herkes bu özelliği etkinleştirebilir.
Örneğin, bir bankacılık uygulaması olduğunuzu varsayalım. Her transferde ek çok öğeli kimlik doğrulamayı zorunlu kılmazsınız çünkü her gün kullanan kullanıcılar bu ek zorluktan hoşlanmaz.
Ancak Gelişmiş Koruma Modu açıkken uygulamanız bu kullanıcının maksimum düzeyde koruma istediğini bilir. Böylece her aktarımda otomatik olarak biyometrik kimlik doğrulama isteyebilirsiniz.
Gelişmiş Koruma Modu, cihaz korumasını güçlendirmek için tasarlanmış önceden tanımlanmış bir dizi yapılandırma uygular.
Burada, uygulamanıza nasıl entegre edeceğinizi gösteriyoruz.
İzin istemeniz, Gelişmiş Koruma Modu'nu sorgulamanız ve kullanıcının Gelişmiş Koruma Modu'nu etkinleştirip etkinleştirmediğini kontrol etmeniz gerekir. Bunun için cihaz üzerinde Gelişmiş Koruma Modu Yöneticisi sistem hizmetini çağırabilirsiniz.
class AdvancedProtectionManager() {
// Check the current status
fun isAdvancedProtectionEnabled(): Boolean
// Be alerted when status changes
fun registerAdvancedProtectionCallback(executor: Executor,
callback: Callback)
fun unregisterAdvancedProtectionCallback(callback: Callback)
}
interface Callback() {
// Called when advanced protection state changes
fun onAdvancedProtectionChanged(enabled: Boolean)
}Ardından, geri çağırma işlevini kaydederek çalışma zamanı değişikliklerini dinleyebilirsiniz.
android skills list
android skills add android-intent-security
android skills add android-permissions-securityandroid skills list
android skills add play-policy-insights<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:usesPermissionFlags="onlyForLocationButton"/>
<uses-permission android:name="android.permission.USE_LOCATION_BUTTON" />
<application
android:icon="@mipmap/ic_launcher"
android:label="LocationButtonSample"
android:theme="@style/Theme.PinPoint">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>...
import androidx.core.locationbutton.compose.LocationButton
@Composable
fun LocationPermissionScreen(onPermissionGranted: () -> Unit, onPermissionDenied: () -> Unit) {
// Renders the secure system-trusted Location Button composable
LocationButton(
// Callback triggered when the user taps the secure button and makes a decision on the permission dialog
onPermissionResult = { isGranted ->
if (isGranted) {
onPermissionGranted()
} else {
onPermissionDenied()
}
},
...class AdvancedProtectionManager() {
// Check the current status
fun isAdvancedProtectionEnabled(): Boolean
// Be alerted when status changes
fun registerAdvancedProtectionCallback(executor: Executor,
callback: Callback)
fun unregisterAdvancedProtectionCallback(callback: Callback)
}
interface Callback() {
// Called when advanced protection state changes
fun onAdvancedProtectionChanged(enabled: Boolean)
}