Skip to content

جستجوی اسرار نهفته (Hardcoded Secrets) ​

در دنیای تست نفوذ اندروید، «اسرار نهفته» به اطلاعات حساسی گفته می‌شود که برنامه‌نویس به اشتباه مستقیما در سورس‌کد، فایل‌های ریسورس یا تنظیمات برنامه قرار داده است. از آنجایی که فایل APK به راحتی دیکمپایل می‌شود، این اطلاعات اولین طعمه برای مهاجمان هستند.

۱. کالبدشکافی محل ذخیره‌سازی اسرار ​

اسرار معمولا در چهار بخش اصلی از اپلیکیشن مخفی شده‌اند:

  1. کلاس‌های Java/Kotlin: متغیرهای ثابت (static final) که حاوی کلیدهای رمزنگاری یا توکن‌ها هستند.
  2. فایل strings.xml: محل نگهداری رشته‌های متنی که اغلب کلیدهای API سرویس‌های ابری (مثل Firebase یا Google Maps) در آن پیدا می‌شود.
  3. پوشه assets/: فایل‌های پیکربندی با پسوند .json یا .properties که ممکن است شامل اطلاعات اتصال به دیتابیس باشند.
  4. فایل‌های Native (.so): پنهان کردن کلیدها در لایه C++ که تحلیل آن‌ها نیازمند ابزارهایی مثل Ghidra است.

۲. اهداف جستجو (Keywords) ​

برای پیدا کردن این گنجینه‌ها، باید سورس‌کد را برای کلمات کلیدی (Regex) خاصی اسکن کنید:

دسته‌بندیکلمات کلیدی پیشنهادی
دسترسیapi_key, access_token, auth_token, client_secret
اعتبارسنجیadmin, password, pass, credential, root
زیرساختurl, endpoint, staging, dev_server, s3_bucket
امنیتaes, rsa, iv, secret_key, crypt

۳. ابزارهای پیشنهادی ​

استفاده از ابزارهای خودکار ریسک خطای انسانی را کاهش می‌دهد:

  • JADX Search: جستجوی متنی در کل کد دیکمپایل شده (Global Search).
  • TruffleHog: شناسایی اسرار بر اساس آنتروپی (تشخیص رشته‌های رندوم و طولانی).
  • MobSF: تحلیل‌گر خودکار که در بخش "Hardcoded Secrets" تمام موارد مشکوک را لیست می‌کند.

فوت کوزه‌گری

همیشه دامین‌هایی که در کد پیدا می‌کنید را بررسی کنید. گاهی دامین‌های Staging یا Development پیدا می‌شوند که برخلاف سرور اصلی، لایه‌های امنیتی ضعیفی دارند و دیتابیس آن‌ها حاوی اطلاعات تستی اما واقعی است.

۴. بخش عملیاتی (Code Library) ​

در ادامه نمونه‌های واقعی از کدهای ناامن و نحوه شکار آن‌ها در ترمینال آورده شده است.

الف) نمونه کد ناامن در Java ​

java
public class Config {
    /* کلید رمزنگاری که هرگز نباید در کد باشد */    
    public static final String AES_KEY = "321_code_223";
    
    /* آدرس سرور توسعه با دسترسی‌های باز */      
    public static final String BASE_URL = "https://dev-api.target-app.com/v1/";

    /* توکن دسترسی به پنل مانیتورینگ */     
    private String monitoringToken = "a1b2c3d4e5f6g7jm8ih8i9j0";
}

ب) موارد امنیتی در فایل ریسورس (strings.xml) ​

xml
<resources>
    <string name="google_maps_key">AIzaSyA1b2C3d4E5f6G7h8I9j0</string>
    <string name="firebase_url">https://target-app.firebaseio.com/</string>
    <string name="stripe_key">pk_test_51Mz...X00</string>
</resources>

ج) جستجوی سریع با دستورات Terminal ​

اگر APK را با ابزاری مثل apktool باز کرده‌اید، از دستورات زیر استفاده کنید:

bash
# جستجو برای پیدا کردن الگوهای API Key گوگل #
grep -roE "AIza[0-9A-Za-z\\-_]{35}" .

# پیدا کردن آدرس‌های ایمیل توسعه‌دهندگان #
grep -rE "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" .

# جستجوی عمومی کلمات حساس (Case-insensitive) #
grep -riE "password|secret|token|key|api|aws|s3" .