<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Android - Category - g03m0n</title>
        <link>https://g03m0n.github.io/categories/android/</link>
        <description>Android - Category - g03m0n</description>
        <generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 04 Apr 2026 08:29:01 &#43;0800</lastBuildDate><atom:link href="https://g03m0n.github.io/categories/android/" rel="self" type="application/rss+xml" /><item>
    <title>Android Pentesting</title>
    <link>https://g03m0n.github.io/posts/android-pentesting/</link>
    <pubDate>Sat, 04 Apr 2026 08:29:01 &#43;0800</pubDate>
    <author>g03m0n</author>
    <guid>https://g03m0n.github.io/posts/android-pentesting/</guid>
    <description><![CDATA[<h1 id="android-pentesting">Android Pentesting</h1>
<h2 id="command">Command</h2>
<h3 id="adb">adb</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>// List device
</span></span><span style="display:flex;"><span>adb devices -l
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// Truy cap shell
</span></span><span style="display:flex;"><span>adb -s &lt;device-name&gt; 
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// &lt;Trong shell&gt;
</span></span><span style="display:flex;"><span>---------------------------
</span></span><span style="display:flex;"><span>// Lay thong tin phien ban android và API level
</span></span><span style="display:flex;"><span>getprop ro.build.version.release
</span></span><span style="display:flex;"><span>getprop ro.build.version.sdk
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// Lay thong tin kien truc CPU
</span></span><span style="display:flex;"><span>getprop ro.product.cpu.abi
</span></span><span style="display:flex;"><span>----------------------------
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// Push file tu Host vao android
</span></span><span style="display:flex;"><span>adb push &lt;/path/to/file/pc&gt; &lt;/path/to/file/android&gt; <span style="color:#f92672">(</span>/data/local/tmp<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// Pull
</span></span><span style="display:flex;"><span>adb pull	&lt;/path/to/file/android&gt;	&lt;/path/to/file/pc&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// Cai dat ung dung
</span></span><span style="display:flex;"><span>adb -s &lt;id-may&gt; install &lt;path/file.apk&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>//Log
</span></span><span style="display:flex;"><span>adb logcat
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// Start server adb
</span></span><span style="display:flex;"><span>adb start-server
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// Restart adb voi quyen root
</span></span><span style="display:flex;"><span>adb 
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>// list package
</span></span><span style="display:flex;"><span>adb shell <span style="color:#e6db74">&#34;pm list packages | grep -i &lt;tenapp&gt;&#34;</span>
</span></span></code></pre></div><h2 id="decomplie-apk">Decomplie APK</h2>
<h3 id="command-line">Command-line</h3>
<p><code>apktool</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#a6e22e">apktool</span> <span style="color:#a6e22e">d</span> <span style="color:#f92672">&lt;</span><span style="color:#a6e22e">file</span><span style="color:#f92672">.</span><span style="color:#a6e22e">apk</span><span style="color:#f92672">&gt;</span> <span style="color:#75715e">// src code smali
</span></span></span></code></pre></div><p><code>jadx</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#a6e22e">jadx</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">r</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">d</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">e</span> <span style="color:#f92672">&lt;</span><span style="color:#a6e22e">file</span><span style="color:#f92672">.</span><span style="color:#a6e22e">apk</span><span style="color:#f92672">&gt;</span> 
</span></span></code></pre></div><h3 id="gui">GUI</h3>
<p><code>apktook-gui</code>, <code>jadx-gui</code>, <code>bytecode-viewer</code></p>
<h2 id="procedure">Procedure</h2>
<ol>
<li>Code -&gt; Compile -&gt; DEX Format</li>
<li>DEX -&gt; Build -&gt; APK</li>
<li>APK -&gt; Signature -&gt; Signed APK</li>
<li>Signed APK -&gt; Google Play -&gt; User Install</li>
</ol>
<h2 id="static-analysis">Static Analysis</h2>
<table>
<thead>
<tr>
<th><strong>#</strong></th>
<th><strong>#</strong></th>
<th><strong>Description</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>1. Decompiling</strong></td>
<td><strong>Kiểm tra file APK và Native Libraries</strong></td>
<td>- Đổi tên file <code>.apk</code> thành <code>.zip</code> và giải nén (Apktool, Jadx).<br>- Kiểm tra thư mục <code>lib/</code> để tìm các native library (file <code>.so</code>).</td>
</tr>
<tr>
<td></td>
<td><strong>Decompile</strong></td>
<td>- Sử dụng <strong>JADX GUI</strong> hoặc <strong>Apktool</strong> (<code>apktool d app.apk -o decompiled</code>) để lấy mã nguồn và file cấu hình.</td>
</tr>
<tr>
<td><strong>2. Static Analysis - <code>AndroidManifest.xml</code></strong></td>
<td><strong>App Permissions</strong></td>
<td>- Tìm các quyền nguy hiểm (ví dụ: <code>READ_CONTACTS</code>, <code>ACCESS_FINE_LOCATION</code>, <code>CAMERA</code>).<br>- Đặt câu hỏi: Ứng dụng có thực sự cần các quyền này không?</td>
</tr>
<tr>
<td></td>
<td><strong>AllowBackup</strong></td>
<td>- Tìm flag <code>&lt;application android:allowBackup=&quot;true&quot;&gt;</code>. <br>- Nếu <code>true</code> (hoặc không khai báo, vì mặc định là true), kẻ tấn công có thể dùng <code>adb backup</code> để lấy file nhạy cảm.<br>- <em>Lệnh test:</em> <code>adb backup -f backup.ab com.example.app</code></td>
</tr>
<tr>
<td></td>
<td><strong>Debuggable Flag</strong></td>
<td>- Tìm flag <code>&lt;application android:debuggable=&quot;true&quot;&gt;</code>.<br>- Nếu <code>true</code>, kẻ tấn công có thể attach debugger, đọc bộ nhớ và sửa biến runtime. (Mặc định là false nhưng dev có thể quên tắt khi release).</td>
</tr>
<tr>
<td></td>
<td><strong>Network Security</strong></td>
<td>- Kiểm tra <code>cleartextTrafficPermitted=&quot;true&quot;</code> trong thẻ <code>&lt;network-security-config&gt;</code>.<br>- Nếu có, ứng dụng cho phép HTTP (không mã hóa), dễ bị MITM.</td>
</tr>
<tr>
<td></td>
<td><strong>SDK Versions</strong></td>
<td>- Kiểm tra <code>minSdkVersion</code> và <code>targetSdkVersion</code>.<br>- SDK cũ thường thiếu các tính năng bảo mật hiện đại.</td>
</tr>
<tr>
<td></td>
<td><strong>Exported Components</strong></td>
<td>- Tìm <code>android:exported=&quot;true&quot;</code> ở 4 loại components:<br>+ <strong>Activities:</strong> Bypass màn hình đăng nhập.<br>+ <strong>Services:</strong> Chạy ngầm tác vụ trái phép.<br>+ <strong>Content Providers:</strong> Đọc trộm dữ liệu (database, token).<br>+ <strong>Broadcast Receivers:</strong> Kích hoạt chức năng ẩn thông qua tin nhắn hệ thống.</td>
</tr>
<tr>
<td><strong>3. Static Analysis - Tìm kiếm nâng cao</strong></td>
<td><strong>Hardcoded Secret</strong></td>
<td>- Tìm passwords, URLs, API keys, tokens, UUIDs bị hardcode.<br>- <em>Tools:</em> apkurlgrep, lệnh <code>strings</code>, Regex tích hợp trong JADX GUI.</td>
</tr>
<tr>
<td></td>
<td><strong>Lỗi cấu hình Firebase</strong></td>
<td>- Tìm URL dạng <code>https://xyz.firebaseio.com/</code> (thường ở <code>res/values/strings.xml</code>).<br>- Thêm <code>.json</code> vào cuối URL trên trình duyệt.<br>- Nếu trả về null hoặc JSON data (không phải Permission Denied) -&gt; Đọc được data.<br>- <em>Test ghi/xóa dữ liệu:</em> Dùng lệnh <code>curl -X PUT</code> và <code>curl -X DELETE</code> để xem có chiếm quyền được database hay không.</td>
</tr>
<tr>
<td></td>
<td><strong>Source Code Analysis</strong></td>
<td>- Quét các lỗ hổng logic: SSL Pinning, Root detection, Debugger checks, Webview (<code>loadUrl()</code>, <code>evaluateJavascript()</code> -&gt; XSS), Intent/Deeplink handlers.<br>- <em>Công cụ tự động:</em> <a href="https://github.com/mindedsecurity/semgrep-rules-android-security" target="_blank" rel="noopener noreffer">Semgrep</a>
 (rule android-security), MobSF.</td>
</tr>
<tr>
<td><strong>4. Kiểm tra Lưu trữ &amp; Tính toàn vẹn</strong></td>
<td><strong>Insecure Storage</strong></td>
<td>- Kiểm tra thư mục <code>/data/data/com.example.app/</code>.<br>- Tìm kiếm các file <code>shared_prefs</code>, logs, sqlite db xem có lưu trữ plaintext các thông tin như token, mật khẩu, thông tin thanh toán hay không.</td>
</tr>
<tr>
<td></td>
<td><strong>Kiểm tra Chữ ký APK (Janus Vulnerability)</strong></td>
<td>- Kiểm tra lỗi CVE-2017-13156 cho phép sửa file APK mà không làm hỏng chữ ký.<br>- <em>Lệnh:</em> <code>apksigner verify --verbose app.apk</code></td>
</tr>
<tr>
<td></td>
<td><strong>Anti-Tampering Check</strong></td>
<td>- Sửa một giá trị bất kỳ (ví dụ đổi true thành false trong manifest).<br>- Recompile bằng apktool, tự sign bằng key và chạy thử. Nếu app vẫn chạy bình thường -&gt; Lỗi thiếu cơ chế kiểm tra tính toàn vẹn.</td>
</tr>
<tr>
<td><strong>5. Dynamic Analysis</strong></td>
<td><strong>Kiểm tra &amp; Bypass Root Detection</strong></td>
<td>- <em>Dấu hiệu app check root:</em> Tìm RootBeer, check binary <code>su</code>, check app Magisk, SafetyNet, Play Integrity.<br>- <em>Cách Bypass:</em> Dùng Magisk Hide / Zygisk DenyList, Frida Scripts, Objection, Xposed/LSPosed Modules (Hide My Applist) hoặc Patch APK thủ công.</td>
</tr>
<tr>
<td></td>
<td><strong>Kiểm tra &amp; Bypass SSL Pinning</strong></td>
<td>- <em>Dấu hiệu app cài SSL Pinning:</em> Dùng Network Security Config, Custom TrustManager, thư viện OkHttp, TrustKit.<br>- <em>Cách Bypass:</em> Dùng Objection, Frida Scripts, HTTP Toolkit hoặc decompile để xóa code check SSL rồi recompile.</td>
</tr>
<tr>
<td></td>
<td><strong>API Testing</strong></td>
<td>- Dùng Burp Suite (sau khi bypass SSL) để test các lỗi logic web như IDOR, BOLA, SQLi trên API, bypass thanh toán.</td>
</tr>
<tr>
<td></td>
<td><strong>Memory Dumping</strong></td>
<td>- Dump bộ nhớ RAM khi app đang chạy để tìm mật khẩu, token, key giải mã chưa kịp xóa. - Công cụ: Fridump, tính năng memory của Objection.</td>
</tr>
<tr>
<td></td>
<td><strong>Runtime Hooking</strong></td>
<td>- Dùng Frida hook trực tiếp vào các hàm nghi ngờ (tạo OTP, check mã PIN) để thay đổi tham số đầu vào hoặc giá trị trả về (return value) ngay lập tức.</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th style="text-align:left">Lỗ hổng</th>
<th style="text-align:left">Mô tả</th>
<th style="text-align:left">Checklist</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>1. SSL Pinning</strong></td>
<td style="text-align:left">Lỗ hổng <strong>SSL Pinning</strong> xảy ra khi ứng dụng không xác minh đúng chứng chỉ SSL hoặc public key của máy chủ trong quá trình handshake SSL/TLS. Điều này cho phép kẻ tấn công thực hiện <em>man-in-the-middle</em> để chặn và giải mã giao tiếp của ứng dụng.</td>
<td style="text-align:left">- Kiểm tra xem <strong>SSL Pinning</strong> có được triển khai không. <br> - <strong>Objection:</strong> Sử dụng lệnh <code>android sslpinning disable</code>. <br> - <strong>Frida:</strong> Sử dụng <code>frida-multiple-unpinning</code> -&gt; <code>frida -U --codeshare akabe1/frida-multiple-unpinning -f YOUR_BINARY</code> <br> - <strong>Xposed:</strong> Cài đặt module <em>TrustMeAlready</em> hoặc <em>SSLUnpinning</em>. <br> - Bypass SSL Pinning sử dụng <strong>APKLab</strong>. <br> - Kiểm tra xem có thể thao túng mã (<em>code manipulation</em>) không.</td>
</tr>
<tr>
<td style="text-align:left"><strong>2. Root Detection</strong></td>
<td style="text-align:left">Lỗ hổng <strong>Root Detection</strong> xảy ra khi ứng dụng không phát hiện và ngăn chặn đúng cách quyền truy cập từ các thiết bị đã root, cho phép người dùng có khả năng giành quyền truy cập trái phép vào dữ liệu hoặc chức năng của app.</td>
<td style="text-align:left">- Kiểm tra xem <strong>Root Detection</strong> có được triển khai không. <br> - Module <strong>MagiskHide</strong> trong ứng dụng Magisk (= &lt;v23.0). <br> - <strong>Zygisk DenyList</strong> trong ứng dụng Magisk (&gt;v23.0). <br> - <em>Tampering</em> (Chỉnh sửa) mã Smali. <br> - <strong>Frida</strong> -&gt; Dùng script <em>fridantiroot</em>. <br> - <strong>Medusa Framework</strong> -&gt; Sử dụng module <code>helpers/anti_debug</code>. <br> - <strong>Objection:</strong> Dùng <code>dex2jar</code> lấy class file -&gt; Phân tích tìm library check root -&gt; Chạy <code>objection -g com.test.app explore</code> -&gt; Tìm method bằng <code>android hooking list class_methods &lt;class&gt;</code> -&gt; Set lại kết quả <code>android hooking set return_value &lt;method&gt; false</code>. Nếu app vẫn báo root, bấm Back ra ngoài (không kill app) rồi vào lại. <br> - Đổi tên binaries: Đôi khi chỉ cần đổi tên binary <code>su</code> là đủ để bypass (nhưng cẩn thận hỏng môi trường). <br> - Unmount <code>/proc</code> để ngăn app đọc danh sách tiến trình. <br> - Dùng <strong>Frida/Xposed</strong> hook các API (Java/native) để ẩn file, tiến trình và trả về các giá trị giả (<em>bogus values</em>). <br> - Hook low-level API bằng kernel modules. <br> - Patch ứng dụng để xóa bỏ các hàm kiểm tra.</td>
</tr>
<tr>
<td style="text-align:left"><strong>3. Emulator Detection</strong></td>
<td style="text-align:left">Lỗ hổng <strong>Emulator Detection</strong> xảy ra khi ứng dụng không phát hiện và ngăn chặn truy cập từ trình giả lập (<em>emulator</em>), cho phép người dùng bypass các kiểm soát bảo mật hoặc truy cập tính năng trái phép.</td>
<td style="text-align:left">- Kiểm tra xem <strong>Emulator Detection</strong> có được triển khai không. <br> - Chỉnh sửa các thuộc tính trong file <code>build.prop</code>. <br> - Patch chức năng nhận diện: Ghi đè mã <em>bytecode</em> hoặc <em>native code</em> liên quan bằng các lệnh <strong>NOP</strong>. <br> - Dùng <strong>Frida/Xposed</strong> hook các API hệ thống file (Java/native) để trả về các thông số giống máy thật thay vì thông số giả lập. Ví dụ: override hàm <code>TelephonyManager.getDeviceID</code> để trả về một mã IMEI hợp lệ.</td>
</tr>
<tr>
<td style="text-align:left"><strong>4. Sensitive Data in ADB Logcat Logs</strong></td>
<td style="text-align:left">Lỗ hổng rò rỉ dữ liệu qua <strong>ADB Logcat</strong> xảy ra khi ứng dụng ghi log các dữ liệu nhạy cảm (mật khẩu, thông tin cá nhân) vào <em>system log</em>, khiến chúng có thể bị lộ cho kẻ tấn công.</td>
<td style="text-align:left">- Quét Logcat logs tìm dữ liệu nhạy cảm bằng lệnh: <br> <code>adb logcat | grep &quot;$(adb shell ps | grep &lt;package-name&gt; | awk '{print $2}')&quot;</code> <br> - Kiểm tra xem logs có thể bị chỉnh  bằng Frida/Objection không. <br> - Tìm các request hoặc dữ liệu dạng <em>unencrypted</em> (không mã hóa) xuất hiện trong log.</td>
</tr>
<tr>
<td style="text-align:left"><strong>5. Sensitive Data Stored in Local Storage</strong></td>
<td style="text-align:left">Lỗ hổng lưu trữ dữ liệu nội bộ xảy ra khi app lưu thông tin nhạy cảm ở dạng không mã hóa (<em>unencrypted</em>) hoặc không an toàn trong <strong>Local Storage</strong> của thiết bị.</td>
<td style="text-align:left">- Kiểm tra cả <em>internal</em> và <em>external storage</em> tìm các file có dữ liệu nhạy cảm. <br> - Tìm các file development, backup hoặc file cũ bị sót lại trong bản production. <br> - Kiểm tra các file <strong>SQLite databases</strong> (tại <code>/data/data/&lt;package-name&gt;/databases</code>). Nếu có mã hóa, hãy xem password sinh ra thế nào và có được bảo vệ bằng <strong>Keystore</strong> hay không. <br> - Kiểm tra <strong>Shared Preferences</strong> (file XML tại <code>/data/data/&lt;package-name&gt;/shared_prefs</code>). Nếu không dùng thư viện như <code>secure-preferences</code>, dữ liệu mặc định sẽ là plaintext. <br> - Kiểm tra quyền (permissions) của thư mục data. Chỉ user/group của app (vd: <code>u0_a82</code>) mới được có quyền rwx. <br> - <strong>Ghost Files trong Shared Preferences:</strong> Nếu bạn có quyền WRITE vào thư mục <code>shared_prefs</code> (dù không có quyền overwrite file hiện tại), bạn có thể tạo một file <code>.bak</code> chứa setting giả mạo. Ở lần chạy tới, Android sẽ tự đổi tên file <code>.bak</code> đó đè lên file gốc một cách âm thầm. <br> - Kiểm tra <strong>Firebase Real-time databases</strong>: Test xem có bị misconfigured bằng cách truy cập <code>https://_firebaseProjectName_.firebaseio.com/.json</code>. <br> - Kiểm tra <strong>Realm database</strong> (đuôi <code>.realm</code>, mặc định tên <code>default</code> tại thư mục <code>/files/</code>). Dùng <em>Realm Browser</em> để xem có bị lộ data unencrypted không.</td>
</tr>
<tr>
<td style="text-align:left"><strong>6. Sensitive Data in Application Memory</strong></td>
<td style="text-align:left">Xảy ra khi ứng dụng lưu trữ thông tin nhạy cảm trong bộ nhớ RAM (<em>Application Memory</em>) ở dạng không an toàn, khiến dữ liệu có thể bị trích xuất nếu kẻ tấn công có quyền truy cập bộ nhớ.</td>
<td style="text-align:left">- Sử dụng công cụ <code>fridump.py</code> để dump bộ nhớ ứng dụng và phân tích tìm các dữ liệu nhạy cảm (password, token&hellip;).</td>
</tr>
<tr>
<td style="text-align:left"><strong>7. Weak Signer Certificate</strong></td>
<td style="text-align:left">Lỗ hổng xảy ra khi ứng dụng được ký (<em>signed</em>) bằng một chứng chỉ (<em>certificate</em>) yếu hoặc đã bị lộ, cho phép kẻ tấn công chỉnh sửa ứng dụng hoặc mạo danh.</td>
<td style="text-align:left">- Kiểm tra xem app có dùng thuật toán ký yếu như <code>SHA1withRSA</code> không. <br> - Kiểm tra lỗ hổng <strong>Janus</strong> (cho phép sửa APK mà không hỏng chữ ký). <br> - Kiểm tra xem ứng dụng có đang dùng <em>debug certificate</em> (chứng chỉ test) thay vì chứng chỉ release không.</td>
</tr>
<tr>
<td style="text-align:left"><strong>8. Vulnerable Android Activities</strong></td>
<td style="text-align:left"><em>Android activities</em> là các thành phần đại diện cho màn hình giao diện. Một Activity có lỗ hổng (do code kém an toàn hoặc dùng thư viện lỗi) có thể bị khai thác để chiếm quyền hoặc bypass logic ứng dụng.</td>
<td style="text-align:left">- <strong>[Authentication Bypass]:</strong> Kiểm tra xem có thể gọi trực tiếp các protected activities thông qua ADB mà không cần đăng nhập không. <br> - <strong>[Exported Sensitive Activity]:</strong> Đảm bảo các activities được đặt cờ <code>exported</code> đã được phân quyền và kiểm soát chặt chẽ. <br> - <strong>[Task Hijacking]:</strong> Kiểm tra khả năng bị chiếm quyền điều khiển luồng activity (hijacking). <br> - <strong>[DOS]:</strong> Gửi các payload lỗi để xem activity có gây ra hiện tượng crash app hoặc từ chối dịch vụ (Denial of Service) hay không.</td>
</tr>
<tr>
<td style="text-align:left"><strong>9. WebView Vulnerabilities</strong></td>
<td style="text-align:left">Android <strong>WebView</strong> là thành phần cho phép ứng dụng hiển thị nội dung web ngay trong giao diện người dùng. Nó có thể chứa các lỗ hổng do lập trình không an toàn, thiếu kiểm tra dữ liệu đầu vào (<em>improper validation</em>).</td>
<td style="text-align:left">- Kiểm tra các lỗ hổng <strong>Cross-Site Scripting (XSS)</strong>. <br> - Kiểm tra các lỗ hổng <strong>Local File Inclusion (LFI)</strong>. <br> - Kiểm tra xem JavaScript có được bật một cách không an toàn không. <br> - Kiểm tra <em>Insecure URL Loading</em> qua hàm <code>loadUrl()</code>, cho phép kẻ tấn công <em>inject</em> các URL độc hại. <br> - Kiểm tra việc sử dụng Javascript Interface: <code>setJavaScriptEnabled(true)</code> cho phép thực thi JavaScript, dẫn đến nguy cơ XSS.</td>
</tr>
<tr>
<td style="text-align:left"><strong>10. Intent Filters</strong></td>
<td style="text-align:left"><strong>Intent redirection</strong> là việc sử dụng <em>implicit</em> hoặc <em>explicit Intent</em> để chuyển tiếp từ component này sang component khác. Lỗ hổng xảy ra khi developer không lọc/kiểm tra dữ liệu intent truyền vào (tương tự như <em>Open Redirect</em> trên Web).</td>
<td style="text-align:left">- Kiểm tra các lỗ hổng <strong>Intent Spoofing</strong> (giả mạo Intent) và <strong>Intent Sniffing</strong> (đánh hơi/nghe lén Intent).</td>
</tr>
<tr>
<td style="text-align:left"><strong>11. Broadcast Receivers</strong></td>
<td style="text-align:left"><strong>Broadcast Receiver</strong> là thành phần cho phép ứng dụng nhận và phản hồi các sự kiện broadcast của toàn hệ thống (ví dụ: nhận tin nhắn SMS, cắm sạc pin). Cấu hình sai có thể dẫn đến việc bị lợi dụng kích hoạt chức năng ẩn.</td>
<td style="text-align:left">- Kiểm tra xem các receiver có cờ <code>exported</code> có bị thiếu các quyền (<em>permissions</em>) bảo vệ thích hợp không.</td>
</tr>
<tr>
<td style="text-align:left"><strong>12. Content Provider Security</strong></td>
<td style="text-align:left"><strong>Content Providers</strong> dùng để chia sẻ dữ liệu giữa các ứng dụng bằng các hàm <em>insert, update, delete, query</em> qua một URI đặc biệt bắt đầu bằng <code>content://</code>. Nếu không cấu hình bảo mật chuẩn, dữ liệu nội bộ có thể bị rò rỉ.</td>
<td style="text-align:left">- Kiểm tra lỗ hổng <strong>SQL Injection</strong>. <br> - Kiểm tra lỗ hổng <strong>Path Traversal</strong>. <br> - Kiểm tra các lỗ hổng truy cập dữ liệu nội bộ. <br> - Nếu cho phép <code>Insert</code>, hãy test khả năng làm ngập lụt (<em>Flooding</em>) Provider bằng lượng lớn dữ liệu (Infinite Data).</td>
</tr>
<tr>
<td style="text-align:left"><strong>13. Source Code Obfuscation</strong></td>
<td style="text-align:left"><strong>Source code obfuscation</strong> (làm rối mã nguồn) là quá trình làm cho mã nguồn khó hiểu và khó bị dịch ngược (<em>reverse engineer</em>), nhằm bảo vệ sở hữu trí tuệ và ngăn chặn chỉnh sửa trái phép.</td>
<td style="text-align:left">- Kiểm tra xem <strong>ProGuard</strong> hoặc các công cụ <em>obfuscation</em> khác có được cấu hình không. <br> - Kiểm tra xem các đoạn mã nhạy cảm có thực sự được làm rối đúng cách chưa.</td>
</tr>
<tr>
<td style="text-align:left"><strong>14. Hardcoded Sensitive Information</strong></td>
<td style="text-align:left">Lỗ hổng lưu cứng dữ liệu xảy ra khi các thông tin nhạy cảm (như mật khẩu, khóa bảo mật) được viết trực tiếp vào <em>source code</em> của ứng dụng, khiến kẻ tấn công dễ dàng trích xuất sau khi decompile.</td>
<td style="text-align:left">- Quét <em>source code</em> để tìm các API keys, tokens, passwords hoặc thông tin xác thực (<em>credentials</em>) bị <strong>hardcode</strong>.</td>
</tr>
<tr>
<td style="text-align:left"><strong>15. Insecure Coding Practices</strong></td>
<td style="text-align:left"><strong>Insecure coding practices</strong> là việc sử dụng các kỹ thuật lập trình không bảo vệ đủ tốt cho ứng dụng (ví dụ: dùng mật khẩu yếu, không validate input), khiến hệ thống dễ bị tấn công.</td>
<td style="text-align:left">- Kiểm tra việc sử dụng các hàm sinh số ngẫu nhiên không an toàn (<em>Insecure random number generators</em>). <br> - Kiểm tra việc sử dụng các hàm (<em>functions</em>) đã bị cấm/không an toàn. <br> - Kiểm tra các chuẩn mã hóa yếu (<em>weak cryptography</em>) (Ví dụ: MD5, mã hóa Base64). <br> - Kiểm tra các điểm yếu về kỹ thuật lập trình khác.</td>
</tr>
<tr>
<td style="text-align:left"><strong>16. Insecure Deeplinks</strong></td>
<td style="text-align:left"><strong>Insecure deeplinks</strong> là các link dẫn sâu vào app không được bảo vệ. Nếu không validate và kiểm soát truy cập, kẻ tấn công có thể lợi dụng deeplinks để ép app thực hiện các hành vi nhạy cảm.</td>
<td style="text-align:left">- Kiểm tra các <em>explicit deeplinks</em> có sử dụng <code>PendingIntent</code>. <br> - Kiểm tra các <em>implicit deeplinks</em> dẫn đến các khu vực nhạy cảm trong app. <br> - Kiểm tra lỗ hổng <strong>Open Redirect</strong>. <br> - Kiểm tra lỗ hổng lộ lọt file nội bộ (<strong>Local File Disclosure</strong>). <br> - Kiểm tra khả năng khai thác các hành động nhạy cảm do ứng dụng thiếu cơ chế xác thực (<em>Authentication bypass</em>).</td>
</tr>
<tr>
<td style="text-align:left"><strong>17. Insecure Services</strong></td>
<td style="text-align:left"><strong>Service</strong> là thành phần nhận dữ liệu, xử lý và trả về phản hồi. Nếu ứng dụng <em>export</em> (mở) một số services, cần kiểm tra mã nguồn để hiểu logic và test động (<em>dynamically test</em>) để trích xuất thông tin bảo mật, bypass xác thực.</td>
<td style="text-align:left">- Kiểm tra sự tồn tại của các <em>services</em> mà không có quyền bảo vệ hợp lý. <br> - Sử dụng <strong>Drozer</strong> hoặc <strong>Activity Manager (am)</strong> để liệt kê và khai thác. <br> - <strong>Lệnh Drozer:</strong> <code>run app.service.info -a &lt;package&gt;</code> (Liệt kê) và <code>run app.service.send &lt;package&gt; &lt;service_name&gt; --msg...</code> (Gửi payload). <br> - <strong>Lệnh adb (am):</strong> <code>adb shell am startservice -n &lt;package&gt;/.&lt;service_name&gt; --es &quot;key&quot; &quot;malicious_data&quot;</code>.</td>
</tr>
<tr>
<td style="text-align:left"><strong>18. Missing Integrity Checks</strong></td>
<td style="text-align:left"><strong>Integrity checks</strong> (Kiểm tra tính toàn vẹn) là quá trình xác minh tính xác thực của mã nguồn ứng dụng, đảm bảo nó chưa bị can thiệp (<em>tampered</em>) hay repackage bởi kẻ tấn công.</td>
<td style="text-align:left">- Thực hiện <em>Decompile</em> (giải mã), chỉnh sửa một vài thông số/logic, <em>recompile</em> (đóng gói lại), tự sign bằng key giả và kiểm tra xem ứng dụng có còn hoạt động bình thường không (Nếu chạy được -&gt; Lỗ hổng).</td>
</tr>
<tr>
<td style="text-align:left"><strong>19. Insecure Android Permissions</strong></td>
<td style="text-align:left">Ứng dụng Android có nhiều quyền (<em>permissions</em>) và các cờ cấu hình được set trong file <code>AndroidManifest.xml</code>. Nếu không cấu hình chặt chẽ, chúng sẽ mở ra bề mặt tấn công rất lớn.</td>
<td style="text-align:left">- Kiểm tra xem <em>cleartext traffic</em> có được bật không (<code>cleartextTrafficPermitted=&quot;true&quot;</code>). <br> - Kiểm tra xem chế độ <em>debug</em> có đang mở không (<code>android:debuggable=&quot;true&quot;</code>). <br> - Kiểm tra xem luật trích xuất dữ liệu (<code>dataExtractionRules</code>) có được định nghĩa an toàn không. <br> - Kiểm tra tính năng <em>backup mode</em> có bị lợi dụng được không (<code>android:allowBackup=&quot;true&quot;</code>). <br> - Rà soát và đánh giá các quyền (<em>permissions</em>) không cần thiết mà app yêu cầu.</td>
</tr>
<tr>
<td style="text-align:left"><strong>20. Background Screen Caching</strong></td>
<td style="text-align:left"><strong>Screen caching</strong> là tính năng tối ưu trải nghiệm của hệ điều hành di động (tự động chụp lại ảnh màn hình app khi thu nhỏ). Điều này vô tình gây rò rỉ dữ liệu nhạy cảm hiển thị trên màn hình.</td>
<td style="text-align:left">- Đẩy ứng dụng xuống chạy ngầm (<em>background</em>), sau đó kiểm tra xem ảnh chụp màn hình (<em>screenshot</em>) lưu trong hệ thống có chứa thông tin nhạy cảm không. Để an toàn, app phải bật cờ <code>FLAG_SECURE</code>.</td>
</tr>
<tr>
<td style="text-align:left"><strong>21. Insecure Firebase Database</strong></td>
<td style="text-align:left"><strong>Firebase Database</strong> là cơ sở dữ liệu thời gian thực trên cloud. Việc developer cấu hình sai luồng phân quyền (<em>security rules</em>) là cực kỳ phổ biến.</td>
<td style="text-align:left">- Thêm <code>.json</code> vào cuối URL của Firebase instance (VD: <code>https://&lt;project&gt;.firebaseio.com/.json</code>) để kiểm tra quyền đọc (<em>read permissions</em>). <br> - Thay thế <code>firebaseio.com</code> bằng <code>appspot.com/.json</code> để kiểm tra các cấu hình sai liên quan đến CORS.</td>
</tr>
<tr>
<td style="text-align:left"><strong>22. Android Lock/Biometric Authentication Bypass</strong></td>
<td style="text-align:left">Một số ứng dụng sử dụng màn hình khóa (<em>Screen Lock</em>) hoặc sinh trắc học (<em>Biometric/Fingerprint</em>) của thiết bị để xác thực người dùng trước khi cho phép dùng chức năng nhạy cảm.</td>
<td style="text-align:left">- Kiểm tra xem cơ chế xác thực này có thể bị <em>bypass</em> bằng cách dùng Frida/Objection (hook vào API sinh trắc học của Android trả về <code>true</code>) hoặc can thiệp trực tiếp vào mã nguồn (<em>code modification</em>) hay không.</td>
</tr>
<tr>
<td style="text-align:left"><strong>23. Key Checks in Dynamic Analysis</strong></td>
<td style="text-align:left">Các bước kiểm tra trọng tâm trong quá trình <strong>Dynamic Analysis</strong> (Phân tích động) khi tương tác với API và máy chủ backend của ứng dụng.</td>
<td style="text-align:left">- Thực hiện kiểm thử bảo mật toàn diện trên API (<em>API security tests</em>). <br> - Kiểm tra các lỗi kiểm soát truy cập (<em>Broken Access Controls</em> như IDOR, BOLA). <br> - Test các lỗ hổng <em>Server-side injections</em> (SQLi, Command Injection&hellip;). <br> - Xác định các luồng rò rỉ dữ liệu nhạy cảm từ phía server. <br> - Thực hiện <em>Fuzz testing</em> để tìm lỗi crash hoặc logic sai từ các input.</td>
</tr>
<tr>
<td style="text-align:left"><strong>24. Other Security Checks</strong></td>
<td style="text-align:left">Các cấu hình bảo mật nhỏ gọn nhưng quan trọng để tăng cường <em>hardening</em> cho phía Client (UI/UX an toàn).</td>
<td style="text-align:left">- Kiểm tra xem các khóa mã hóa (<em>cryptographic keys</em>) có bị dùng lại không. <br> - Kiểm tra bộ nhớ đệm bàn phím (<em>keyboard cache/dictionary</em>) đã bị tắt cho các trường nhạy cảm chưa. <br> - Kiểm tra xem chức năng Copy/Paste đã bị chặn ở các ô nhập mật khẩu/OTP chưa. <br> - Kiểm tra xem dữ liệu nhạy cảm có được che giấu (<em>masked</em>) trên UI khi chuyển app không. <br> - Kiểm tra xem app có chặn bàn phím của bên thứ ba (<em>third-party keyboards</em>) khi nhập liệu quan trọng không.</td>
</tr>
</tbody>
</table>
]]></description>
</item>
</channel>
</rss>
