mirror of
https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
synced 2026-10-12 02:06:59 +00:00
* String extraction from APK, Source, AAR, JAR, SO * Strings sections to show source of strings extracted * Strings Refactor * Support for independent .SO scan * Android SCA rules update * Entropies scan support for strings * URLs/Email extraction refactor * Bug Fixes * iOS Source Report Fix * Frida APK Patcher (WIP) * Dynamic Analyzer identifier not available * Settings env var not working fix for enabled by default features * AppSec Score fix * Recent `scan not completed` fix for iOS zip
1011 lines
42 KiB
HTML
Executable File
1011 lines
42 KiB
HTML
Executable File
{% block content %}
|
|
{% load static %}
|
|
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>MobSF Static Analysis Report</title>
|
|
<meta name="description" content="MobSF Report">
|
|
{% if host_os == 'windows' %}
|
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
|
|
<link href='https://fonts.googleapis.com/css?family=Oswald' rel='stylesheet' type='text/css'>
|
|
{% else %}
|
|
<style>
|
|
|
|
/* latin */
|
|
@font-face {
|
|
font-family: 'Open Sans';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: local('Open Sans Regular'), local('OpenSans-Regular'), url('{{base_url}}{% static 'fonts/Open_Sans/OpenSans-Regular.ttf' %}') format('truetype');
|
|
}
|
|
|
|
/* latin */
|
|
@font-face {
|
|
font-family: 'Oswald';
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
font-display: swap;
|
|
src: local('Oswald'), local('Oswald'), url('{{base_url}}{% static 'fonts/Oswald/Oswald-Regular.ttf' %}') format('truetype');
|
|
}
|
|
|
|
</style>
|
|
{% endif %}
|
|
<link rel="stylesheet" href="{{base_url}}{% static "others/css/pdf_report.css" %}">
|
|
<link rel="stylesheet" href="{{base_url}}{% static "adminlte/plugins/fontawesome-free/css/all.min.css" %}">
|
|
</head>
|
|
|
|
<body bgcolor="FFFFFF">
|
|
<article id="cover">
|
|
<div class="header">
|
|
<img src="{{base_url}}{% static "img/mobsf_logo.png" %}" class="center logo" alt="MobSF Logo"/>
|
|
<div class="htext">ANDROID STATIC ANALYSIS REPORT </div>
|
|
</div>
|
|
</br></br></br>
|
|
<div class="app">
|
|
<img class="center" id="icon" src="{% if icon_found %}{{dwd_dir}}{{ md5 }}-icon.png{% else %}{{base_url}}{% static 'img/no_icon.png' %}{% endif %}" alt="app_icon"/>
|
|
</div>
|
|
<div class="center">
|
|
<h1><i class="fab fa-android"></i> {% if app_name %} {{ app_name }} {% else %} {{ file_name }} {% endif %} {% if version_name %} ({{version_name}}) {% endif %}</h1>
|
|
</div>
|
|
</br></br></br></br></br>
|
|
<div class="container">
|
|
<table class="basic no_border">
|
|
<tr class="no_border">
|
|
<td class="no_border"><h3>File Name:</h3></td>
|
|
<td class="no_border"><h3>{{file_name}}</h3></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="no_border"><h3>Package Name:</h3></td>
|
|
<td class="no_border"><h3>{{ package_name }}</h3></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="no_border"><h3>Scan Date:</h3></td>
|
|
<td class="no_border"><h3>{{ timestamp }}</h3></td>
|
|
</tr>
|
|
{% if app_type not in 'so' %}
|
|
{% if average_cvss %}
|
|
<tr>
|
|
<td class="no_border"><h3>Average CVSS Score:</h3></td>
|
|
<td class="no_border"><h3>
|
|
|
|
{% if average_cvss > 6 %}
|
|
<span class="danger">{{ average_cvss }} </span>
|
|
{% elif average_cvss == 0 %}
|
|
{{ average_cvss }}
|
|
{% elif average_cvss >= 4 %}
|
|
<span class="warning">{{ average_cvss }}</span>
|
|
{% elif average_cvss < 4 %}
|
|
<span class="success">{{ average_cvss }}</span>
|
|
{% endif %}
|
|
</h3></td>
|
|
</tr>
|
|
{% endif %}
|
|
<tr>
|
|
<td class="no_border"><h3> App Security Score:</h3></td>
|
|
<td class="no_border">
|
|
<h2>
|
|
{% if appsec.security_score < 30 %}
|
|
<span class="danger">{{ appsec.security_score }}/100 (CRITICAL RISK)</span>
|
|
{% elif appsec.security_score < 40 %}
|
|
<span class="high">{{ appsec.security_score }}/100 (HIGH RISK)</span>
|
|
{% elif appsec.security_score < 60 %}
|
|
<span class="warning">{{ appsec.security_score }}/100 (MEDIUM RISK)</span>
|
|
{% else %}
|
|
<span class="success">{{ appsec.security_score }}/100 (LOW RISK)</span>
|
|
{% endif %}
|
|
</h2>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="no_border"><h3> Grade:</h3></td>
|
|
<td class="no_border">
|
|
<h3>
|
|
<span class="grade" style="background:
|
|
{% if appsec.security_score < 30 %}
|
|
#ff0018">F
|
|
{% elif appsec.security_score < 40 %}
|
|
#ffc107">C
|
|
{% elif appsec.security_score < 60 %}
|
|
#f4ff45">B
|
|
{% else %}
|
|
#28a745">A
|
|
{% endif %}
|
|
</span>
|
|
</br>
|
|
</h3>
|
|
</td>
|
|
</tr>
|
|
{% if trackers|key:"trackers" %}
|
|
<tr>
|
|
<td class="no_border"><h3>Trackers Detection:</h3></td>
|
|
<td class="no_border"><h3><span {% if trackers.detected_trackers > 0 %} class="warning" {% endif %}>{{ trackers.detected_trackers }}/{{ trackers.total_trackers }}</span></h3></td>
|
|
</tr>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if virus_total and virus_total.items|length > 9 and 'request successfully queued' not in virus_total.verbose_msg %}
|
|
<tr>
|
|
<td class="no_border"><h3>VirusTotal Detection:</h3></td>
|
|
<td class="no_border"><h3><span class="{% if virus_total.positives > 0 %}danger{% else %}success{% endif %}"> {{ virus_total.positives }}/{{ virus_total.total }}</span></h3></td>
|
|
</tr>
|
|
{% endif %}
|
|
|
|
</table>
|
|
{% if app_type not in 'so' %}
|
|
</br></br>
|
|
</br></br>
|
|
</br></br>
|
|
</br></br>
|
|
</br></br>
|
|
</br></br>
|
|
</br></br>
|
|
</br></br>
|
|
</br></br>
|
|
<h2><i class="fas fa-chart-pie mr-1"></i> FINDINGS SEVERITY</h2>
|
|
<table class="basic tbl-white">
|
|
<tr>
|
|
<th class="td-high"><i class="fas fa-bug"> </i> HIGH</th>
|
|
<th class="td-warning"><i class="fas fa-exclamation-triangle"> </i> MEDIUM</th>
|
|
<th class="td-info"><i class="fas fa-info"> </i> INFO</th>
|
|
<th class="td-success"><i class="fas fa-check"></i> SECURE</th>
|
|
<th class="td-secondary"><i class="fab fa-searchengin"></i> HOTSPOT</th>
|
|
</tr>
|
|
<tr>
|
|
<td class="td-high"><h2>{{ appsec.high | length}}</h2></td>
|
|
<td class="td-warning"><h2>{{ appsec.warning | length}}</h2></td>
|
|
<td class="td-info"><h2>{{ appsec.info | length}}</h2></td>
|
|
<td class="td-success"><h2>{{ appsec.secure | length}}</h2></td>
|
|
<td class="td-secondary"><h2>{{ appsec.hotspot | length}}</h2></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
|
|
</article>
|
|
{% endif %}
|
|
<article id="contents">
|
|
|
|
|
|
<h2><i class="fas fa-box-open"></i> FILE INFORMATION</h2>
|
|
|
|
<h5>File Name:</h5> {{ file_name }}</br>
|
|
<h5>Size: </h5> {{ size }}</br>
|
|
<h5>MD5:</h5> {{ md5 }}</br>
|
|
<h5>SHA1:</h5> {{ sha1 }}</br>
|
|
<h5>SHA256:</h5> {{ sha256 }}</br>
|
|
|
|
{% if app_type not in 'so' %}
|
|
<h2><i class="fas fa-info"></i> APP INFORMATION</h2>
|
|
|
|
<h5>App Name:</h5> {{ app_name }}</br>
|
|
<h5>Package Name:</h5> {{ package_name }}</br>
|
|
<h5>Main Activity:</h5> {{ main_activity }}</br>
|
|
<h5>Target SDK:</h5> {{ target_sdk }}</br>
|
|
<h5>Min SDK:</h5> {{ min_sdk }}</br>
|
|
<h5>Max SDK:</h5> {{ max_sdk }}</br>
|
|
<h5>Android Version Name:</h5> {{ version_name }}</br>
|
|
<h5>Android Version Code:</h5> {{ version_code }}</br>
|
|
{% endif %}
|
|
|
|
{% if app_type not in 'jar,aar,so' %}
|
|
<h2><i class="fas fa-th-large"></i> APP COMPONENTS </h2>
|
|
|
|
<h5>Activities:</h5> {{ activities | length }}</br>
|
|
<h5>Services:</h5> {{ services | length }}</br>
|
|
<h5>Receivers:</h5> {{ receivers | length }}</br>
|
|
<h5>Providers:</h5> {{ providers | length }}</br>
|
|
<h5>Exported Activities:</h5> <span {% if exported_count.exported_activities > 0 %} class="danger" {% endif %}> {{ exported_count.exported_activities }}</span></br>
|
|
<h5>Exported Services:</h5> <span {% if exported_count.exported_services > 0 %} class="danger" {% endif %}> {{ exported_count.exported_services }}</span></br>
|
|
<h5>Exported Receivers:</h5> <span {% if exported_count.exported_receivers > 0 %} class="danger" {% endif %}> {{ exported_count.exported_receivers }}</span></br>
|
|
<h5>Exported Providers:</h5> <span {% if exported_count.exported_providers > 0 %} class="danger" {% endif %}> {{ exported_count.exported_providers }}</span></br>
|
|
{% endif %}
|
|
{% if app_type not in 'so' %}
|
|
<h2><i class="fa fa-certificate"></i> CERTIFICATE INFORMATION</h2>
|
|
{% if certificate_analysis.certificate_info %}
|
|
<div class="panel-body">
|
|
<p class="wrapped-text">{{ certificate_analysis.certificate_info }}</p>
|
|
</div>
|
|
{% else %}
|
|
<span class="danger">Failed to read Code Signing Certificate or none available.</span>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if permissions %}
|
|
<h2><i class="fa fa-list"></i> APPLICATION PERMISSIONS</h2>
|
|
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>PERMISSION</th>
|
|
<th>STATUS</th>
|
|
<th>INFO </th>
|
|
<th>DESCRIPTION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for perm,desc in permissions.items %}
|
|
<tr>
|
|
<td>{{ perm }}</td>
|
|
<td>
|
|
{% if desc.status == 'dangerous' %}
|
|
<span class="danger">dangerous</span>
|
|
{% elif desc.status == 'normal' %}
|
|
<span class="info">normal</span>
|
|
{% elif desc.status == 'signatureOrSystem' %}
|
|
<span class="warning">SignatureOrSystem</span>
|
|
{% elif desc.status == 'signature' %}
|
|
<span class="success">signature</span>
|
|
{% elif desc.status == 'unknown' %}
|
|
<span class="secondary">unknown</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ desc.info }}</td>
|
|
<td>{{ desc.description }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if virus_total and virus_total.items|length > 9 and 'request successfully queued' not in virus_total.verbose_msg %}
|
|
<h2><i class="fas fa-spider"></i> VIRUSTOTAL SCAN</h2>
|
|
<p> <h5>{{ virus_total.positives }} / {{ virus_total.total }}</h5> AVs found this file Malicious! </p>
|
|
{% if virus_total.positives %}
|
|
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>AV</th>
|
|
<th>DETECTION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for av_name,av_result in virus_total.scans.items %}
|
|
{% if av_result.detected == True %}
|
|
<tr>
|
|
<td>
|
|
{{ av_name }}
|
|
</td>
|
|
<td>
|
|
<span class="danger">{{ av_result.result }}</span>
|
|
</td>
|
|
</tr>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if apkid %}
|
|
<h2><i class="fas fa-fingerprint"></i> APKID ANALYSIS</h2>
|
|
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>FILE</th>
|
|
<th>DETAILS</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% if apkid %}
|
|
{% for file, details in apkid.items %}
|
|
<tr>
|
|
<td>
|
|
{{file}}
|
|
</td>
|
|
<td>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>FINDINGS</th>
|
|
<th>DETAILS</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for detail, idens in details.items %}
|
|
<tr>
|
|
<td>
|
|
{% if detail == "anti_vm" %}
|
|
<span class="warning">Anti-VM Code</span>
|
|
{% elif detail == "anti_disassembly" %}
|
|
<span class="warning">Anti Disassembly Code</span>
|
|
{% elif detail == "anti_debug" %}
|
|
<span class="warning">Anti Debug Code</span>
|
|
{% elif detail == "compiler" %}
|
|
<span class="info">Compiler</span>
|
|
{% elif detail == "abnormal" %}
|
|
<span class="warning">Abnormal Code</span>
|
|
{% elif detail == "obfuscator" %}
|
|
<span class="warning">Obfuscator</span>
|
|
{% elif detail == "protector" %}
|
|
<span class="info">Protector</span>
|
|
{% elif detail == "packer" %}
|
|
<span class="danger">Packer Found</span>
|
|
{% elif detail == "dropper" %}
|
|
<span class="danger">Dropper Found</span>
|
|
{% elif detail == "manipulator" %}
|
|
<span class="warning">Manipulator Found</span>
|
|
{% else %}
|
|
<span class="info">{{detail}}</span>
|
|
{% endif %}
|
|
</td>
|
|
<td> {% for idn in idens %} {{ idn }}</br> {% endfor %}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
|
|
</tr>
|
|
{% endfor %}
|
|
{% else %}
|
|
<p align="center"><strong>APKiD not enabled.</strong></p>
|
|
{% endif %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
{% if browsable_activities %}
|
|
<h2><i class="fas fa-clone"></i> BROWSABLE ACTIVITIES</h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>ACTIVITY</th>
|
|
<th>INTENT</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for activity,intent_details in browsable_activities.items %}
|
|
<tr>
|
|
<td>{{activity}}</td>
|
|
<td>
|
|
{% if intent_details|key:"schemes" %}
|
|
<strong>Schemes</strong>:
|
|
{% for scheme in intent_details|key:"schemes" %}
|
|
{{scheme}},
|
|
{% endfor %}
|
|
</br>
|
|
{% endif %}
|
|
{% if intent_details|key:"hosts" %}
|
|
<strong>Hosts:</strong> {% for host in intent_details|key:"hosts" %}
|
|
{{host}},
|
|
{% endfor %}
|
|
</br>
|
|
{% endif %}
|
|
{% if intent_details|key:"ports" %}
|
|
<strong>Ports:</strong> {% for port in intent_details|key:"ports" %}
|
|
{{port}},
|
|
{% endfor %}
|
|
</br>
|
|
{% endif %}
|
|
{% if intent_details|key:"mime_types" %}
|
|
<strong>Mime Types:</strong> {% for mime in intent_details|key:"mime_types" %}
|
|
{{mime}},
|
|
{% endfor %}
|
|
</br>
|
|
{% endif %}
|
|
{% if intent_details|key:"paths" %}
|
|
<strong>Paths:</strong> {% for path in intent_details|key:"paths" %}
|
|
{{path}},
|
|
{% endfor %}
|
|
</br>
|
|
{% endif %}
|
|
{% if intent_details|key:"path_prefixs" %}
|
|
<strong>Path Prefixes:</strong> {% for prefix in intent_details|key:"path_prefixs" %}
|
|
{{prefix}},
|
|
{% endfor %}
|
|
</br>
|
|
{% endif %}
|
|
{% if intent_details|key:"path_patterns" %}
|
|
<strong>Path Patterns:</strong> {% for pattern in intent_details|key:"path_patterns" %}
|
|
{{pattern}},
|
|
{% endfor %}
|
|
</br>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
{% if app_type not in 'so' %}
|
|
<h2><i class="fas fa-lock"></i> NETWORK SECURITY</h2>
|
|
{% if network_security and 'network_summary' in network_security and network_security.network_summary|length > 0 %}
|
|
<span class="danger">HIGH: </span>
|
|
<h5 class="description-header">{{ network_security.network_summary.high }}</h5> |
|
|
<span class="warning"></i> WARNING: </span>
|
|
<h5 class="description-header">{{ network_security.network_summary.warning }}</h5> |
|
|
<span class="info">INFO: </span>
|
|
<h5 class="description-header">{{ network_security.network_summary.info }}</h5> |
|
|
<span class="success">SECURE: </span>
|
|
<h5 class="description-header">{{ network_security.network_summary.secure }}</h5>
|
|
{% endif %}</br>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>NO</th>
|
|
<th>SCOPE</th>
|
|
<th>SEVERITY</th>
|
|
<th>DESCRIPTION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% if network_security and 'network_findings' in network_security %}
|
|
{% for item in network_security.network_findings %}
|
|
<tr>
|
|
<td>{{ forloop.counter }}</td>
|
|
<td>
|
|
{% for url in item.scope %}
|
|
{{ url }}</br>
|
|
{% endfor %}
|
|
</td>
|
|
<td>
|
|
{% if item.severity == "high" %}
|
|
<span class="danger">high</span>
|
|
{% elif item.severity == "secure" %}
|
|
<span class="success">secure</span>
|
|
{% elif item.severity == "info" %}
|
|
<span class="info">info</span>
|
|
{% elif item.severity == "warning" %}
|
|
<span class="warning">warning</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{{item.description }}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% endif %}
|
|
</tbody>
|
|
</table>
|
|
|
|
<h2><i class="fas fa fa-id-card"></i> CERTIFICATE ANALYSIS</h2>
|
|
{% if certificate_analysis and 'certificate_summary' in certificate_analysis and certificate_analysis.certificate_summary|length > 0 %}
|
|
<span class="danger">HIGH: </span>
|
|
<h5 class="description-header">{{ certificate_analysis.certificate_summary.high }}</h5> |
|
|
<span class="warning"></i> WARNING: </span>
|
|
<h5 class="description-header">{{ certificate_analysis.certificate_summary.warning }}</h5> |
|
|
<span class="info">INFO: </span>
|
|
<h5 class="description-header">{{ certificate_analysis.certificate_summary.info }}</h5>
|
|
{% endif %}</br>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>TITLE</th>
|
|
<th>SEVERITY</th>
|
|
<th>DESCRIPTION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% if certificate_analysis and 'certificate_findings' in certificate_analysis %}
|
|
{% for find in certificate_analysis.certificate_findings %}
|
|
<tr>
|
|
<td>{{ find.2 }}</td>
|
|
<td>
|
|
{% if find.0 == 'high' %}
|
|
<span class="danger">high</span>
|
|
{% elif find.0 == 'secure' %}
|
|
<span class="success">secure</span>
|
|
{% elif find.0 == 'warning' %}
|
|
<span class="warning">warning</span>
|
|
{% elif find.0 == 'info' %}
|
|
<span class="info">info</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ find.1 }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% endif %}
|
|
</tbody>
|
|
</table>
|
|
|
|
<h2><i class="fas fa-search"></i> MANIFEST ANALYSIS</h2>
|
|
{% if manifest_analysis and 'manifest_summary' in manifest_analysis and manifest_analysis.manifest_summary|length > 0 %}
|
|
<span class="danger">HIGH: </span>
|
|
<h5 class="description-header">{{ manifest_analysis.manifest_summary.high }}</h5> |
|
|
<span class="warning"></i> WARNING: </span>
|
|
<h5 class="description-header">{{ manifest_analysis.manifest_summary.warning }}</h5> |
|
|
<span class="info">INFO: </span>
|
|
<h5 class="description-header">{{ manifest_analysis.manifest_summary.info }}</h5> |
|
|
<span class="disabled">SUPPRESSED: </span>
|
|
<h5 class="description-header">{{ manifest_analysis.manifest_summary.suppressed }}</h5>
|
|
{% endif %}</br>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>NO</th>
|
|
<th>ISSUE</th>
|
|
<th>SEVERITY</th>
|
|
<th>DESCRIPTION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% if manifest_analysis and 'manifest_findings' in manifest_analysis %}
|
|
{% for item in manifest_analysis.manifest_findings %}
|
|
<tr>
|
|
<td>{{ forloop.counter }}</td>
|
|
<td>
|
|
{{item|key:"title" | safe}}
|
|
</td>
|
|
<td>
|
|
|
|
{% if item|key:"severity" == "high" %}
|
|
<span class="danger">high</span>
|
|
{% elif item|key:"severity" == "info" %}
|
|
<span class="info">info</span>
|
|
{% elif item|key:"severity" == "warning" %}
|
|
<span class="warning">warning</span>
|
|
{% endif %}
|
|
|
|
</td>
|
|
<td>
|
|
{{item|key:"description"}}
|
|
</td>
|
|
|
|
</tr>
|
|
{% endfor %}
|
|
{% endif %}
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
<h2><i class="fas fa-code"></i> CODE ANALYSIS</h2>
|
|
{% if code_analysis and 'summary' in code_analysis and code_analysis.summary|length > 0 %}
|
|
<span class="danger">HIGH: </span>
|
|
<h5 class="description-header">{{ code_analysis.summary.high }}</h5> |
|
|
<span class="warning"></i> WARNING: </span>
|
|
<h5 class="description-header">{{ code_analysis.summary.warning }}</h5> |
|
|
<span class="info">INFO: </span>
|
|
<h5 class="description-header">{{ code_analysis.summary.info }}</h5> |
|
|
<span class="success">SECURE: </span>
|
|
<h5 class="description-header">{{ code_analysis.summary.secure }}</h5> |
|
|
<span class="disabled">SUPPRESSED: </span>
|
|
<h5 class="description-header">{{ code_analysis.summary.suppressed }}</h5>
|
|
{% endif %}</br>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>NO</th>
|
|
<th>ISSUE</th>
|
|
<th>SEVERITY</th>
|
|
<th>STANDARDS</th>
|
|
<th>FILES</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% if code_analysis and 'findings' in code_analysis %}
|
|
{% for rule, details in code_analysis.findings.items %}
|
|
<tr>
|
|
<td>{{ forloop.counter }}</td>
|
|
<td width="25%">
|
|
{% if details.metadata|key:"ref" %}
|
|
<a href="{{details.metadata.ref}}" target="_blank" rel="noopener"> {{ details.metadata.description }}</a>
|
|
{% else %}
|
|
{{ details.metadata.description }}
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if details.metadata.severity == "high" %}
|
|
<span class="danger">high</span>
|
|
{% elif details.metadata.severity == "good" %}
|
|
<span class="success">secure</span>
|
|
{% elif details.metadata.severity == "warning" %}
|
|
<span class="warning">warning</span>
|
|
{% elif details.metadata.severity == "info" %}
|
|
<span class="info">info</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if average_cvss %}
|
|
<strong>CVSS V2:</strong>
|
|
{{ details.metadata.cvss }}
|
|
{% if details.metadata.cvss > 6 %}
|
|
<span class="danger"> (high)</span>
|
|
{% elif details.metadata.cvss == 0 %}
|
|
<span class="info">(info)</span>
|
|
{% elif details.metadata.cvss >= 4 %}
|
|
<span class="warning"> (medium)</span>
|
|
{% elif details.metadata.cvss < 4 %}
|
|
<span class="success"> (low)</span>
|
|
{% endif %}
|
|
</br>
|
|
{% endif %}
|
|
{% if details.metadata.cwe %}<strong>CWE: </strong>{{ details.metadata.cwe }}{% endif %}
|
|
{% if details.metadata|key:"owasp-mobile" %}</br> <strong>OWASP Top 10: </strong>{{ details.metadata|key:"owasp-mobile" }}{% endif %}
|
|
{% if details.metadata.masvs %}</br> <strong>OWASP MASVS: </strong>{{ details.metadata.masvs }}{% endif %}
|
|
</td>
|
|
<td style="word-break:break-all;">
|
|
{% for file_path in details.files %}
|
|
{{ file_path }}
|
|
<br/>
|
|
{% endfor %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
{% endif %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if binary_analysis %}
|
|
<h2><i class="fa fa-flag"></i> SHARED LIBRARY BINARY ANALYSIS</h2>
|
|
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>NO</th>
|
|
<th>SHARED OBJECT</th>
|
|
<th>NX</th>
|
|
<th>STACK CANARY</th>
|
|
<th>RPATH</th>
|
|
<th>RUNPATH</th>
|
|
<th>FORTIFY</th>
|
|
<th>SYMBOLS STRIPPED</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% if not binary_analysis %}
|
|
No Shared Objects found.
|
|
{% endif %}
|
|
{% for so in binary_analysis %}
|
|
<tr>
|
|
<td>{{ forloop.counter }}</td>
|
|
<td width="20%">{{so.name}}</td>
|
|
<td style="vertical-align: top;"><b>{{so.nx.is_nx}}</b>
|
|
<br/>
|
|
<span class="{% if so.nx.severity == 'high' %}danger{% elif so.nx.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.nx.severity}}</span>
|
|
<br/>{{so.nx.description}}</td>
|
|
<td style="vertical-align: top;"><b>{{so.stack_canary.has_canary}}</b>
|
|
<br/>
|
|
<span class="{% if so.stack_canary.severity == 'high' %}danger{% elif so.stack_canary.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.stack_canary.severity}}</span>
|
|
<br/>{{so.stack_canary.description}}</td>
|
|
<td style="vertical-align: top;"><b>{{so.rpath.rpath}}</b>
|
|
<br/>
|
|
<span class="{% if so.rpath.severity == 'high' %}danger{% elif so.rpath.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.rpath.severity}}</span>
|
|
<br/>{{so.rpath.description}}</td>
|
|
<td style="vertical-align: top;"><b>{{so.runpath.runpath}}</b>
|
|
<br/>
|
|
<span class="{% if so.runpath.severity == 'high' %}danger{% elif so.runpath.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.runpath.severity}}</span>
|
|
<br/>{{so.runpath.description}}</td>
|
|
<td style="vertical-align: top;"><b>{{so.fortify.is_fortified}}</b>
|
|
<br/>
|
|
<span class="{% if so.fortify.severity == 'high' %}danger{% elif so.fortify.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.fortify.severity}}</span>
|
|
<br/>{{so.fortify.description}}</td>
|
|
<td style="vertical-align: top;"><b>{{so.symbol.is_stripped}}</b>
|
|
<br/>
|
|
<span class="{% if so.symbol.severity == 'high' %}danger{% elif so.symbol.severity == 'warning' %}warning{% else %}info{% endif %}">{{so.symbol.severity}}</span>
|
|
<br/>{{so.symbol.description}}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
{% if app_type not in 'so' %}
|
|
<h2><i class="fa fa-id-badge"></i> NIAP ANALYSIS v1.3</h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>NO</th>
|
|
<th>IDENTIFIER</th>
|
|
<th>REQUIREMENT</th>
|
|
<th>FEATURE</th>
|
|
<th>DESCRIPTION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for iden, details in niap_analysis.items %}
|
|
<tr>
|
|
<td>{{ forloop.counter }}</td>
|
|
<td>
|
|
<span class="{% if 'does not' in details.choice %} warning {% elif 'not in accordance' in details.choice %} danger {% else %} info {% endif %}"> {{ iden }}</span>
|
|
</td>
|
|
<td>
|
|
{{ details.class }}
|
|
</td>
|
|
<td>
|
|
{{ details.description }}
|
|
</td>
|
|
<td>
|
|
{{ details.choice }}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
<!-- Added for anyone who needs QUARK Results in Report
|
|
{% if quark %}
|
|
<h2><i class="fab fa-quora"></i> QUARK </h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>POTENTIAL MALICIOUS BEHAVIOUR</th>
|
|
<th>EVIDENCE</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for item in quark %}
|
|
<tr>
|
|
<td style="word-break:break-all;">
|
|
{{ item.crime }}
|
|
</td>
|
|
<td style="word-break:break-all;">
|
|
{% for api in item.register %}
|
|
{{api.file}} -> {{api.method}}
|
|
<br/>
|
|
{% endfor %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
-->
|
|
{% if domains %}
|
|
<h2><i class="fa fa-exclamation"></i> OFAC SANCTIONED COUNTRIES</h2>
|
|
<p>This app may communicate with the following OFAC sanctioned list of countries.</p>
|
|
<table id="table_ofac" class="table table-bordered table-hover table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th>DOMAIN</th>
|
|
<th>COUNTRY/REGION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for domain, details in domains.items %}
|
|
{% if details|key:"ofac" == True %}
|
|
<tr><td>{{domain}}</td>
|
|
<td>
|
|
<strong>IP: </strong>{{details|key:"geolocation"|key:"ip"}} <br/>
|
|
<strong>Country: </strong>{{details|key:"geolocation"|key:"country_long"}} <br/>
|
|
<strong>Region: </strong>{{details|key:"geolocation"|key:"region"}} <br/>
|
|
<strong>City: </strong>{{details|key:"geolocation"|key:"city"}} <br/>
|
|
</td>
|
|
</tr>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
|
|
<h2><i class="fab fa-searchengin"></i> DOMAIN MALWARE CHECK</h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>DOMAIN</th>
|
|
<th>STATUS</th>
|
|
<th>GEOLOCATION</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for domain, details in domains.items %}
|
|
<tr><td>{{domain}}</td><td>
|
|
|
|
{% if details|key:"bad" == "yes" %}
|
|
<span class="danger">malware</span><br/>
|
|
|
|
<h5>URL: </h5> {{details|key:"domain_or_url"}}
|
|
<h5>IP: </h5> <span class="danger">{{details|key:"ip"}}</span>
|
|
<h5>Description: </h5> {{details|key:"desc"}}
|
|
|
|
{% else %}
|
|
<span class="success">ok</span><br/>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if details|key:"geolocation" %}
|
|
|
|
<h5>IP: </h5> {{details|key:"geolocation"|key:"ip"}} <br/>
|
|
<h5>Country: </h5> {{details|key:"geolocation"|key:"country_long"}} <br/>
|
|
<h5>Region: </h5> {{details|key:"geolocation"|key:"region"}} <br/>
|
|
<h5>City: </h5> {{details|key:"geolocation"|key:"city"}} <br/>
|
|
<h5>Latitude: </h5> {{details|key:"geolocation"|key:"latitude"}} <br/>
|
|
<h5>Longitude: </h5> {{details|key:"geolocation"|key:"longitude"}} <br/>
|
|
<h5>View: </h5> <a target="_blank" href="http://maps.google.com/maps?q={{details|key:"geolocation"|key:"latitude"}},{{details|key:"geolocation"|key:"longitude"}}">Google Map</a>
|
|
{% else %}
|
|
No Geolocation information available.
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
<!-- Display urls only for so files-->
|
|
{% if app_type in 'so' %}
|
|
{% if urls %}
|
|
<h2><i class="fas fa-globe"></i> URLS </h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>URL</th>
|
|
<th>FILE</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for urldict in urls %}
|
|
<tr>
|
|
<td style="word-break:break-all;">
|
|
{% for u in urldict|key:"urls" %}
|
|
{{ u }} </br>
|
|
{% endfor %}
|
|
</td>
|
|
<td style="word-break:break-all;">
|
|
{{urldict|key:"path"}}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if firebase_urls %}
|
|
<h2><i class="fas fa-database"></i> FIREBASE DATABASES</h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>FIREBASE URL</th>
|
|
<th>DETAILS</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for item in firebase_urls %}
|
|
<tr>
|
|
<td>
|
|
{{ item.url }}
|
|
</td>
|
|
<td>
|
|
{% if item.open %}
|
|
<span class="danger">high</span></br>Firebase DB is exposed publicly.
|
|
{% else %}
|
|
<span class="info">info</span></br>App talks to a Firebase Database.
|
|
{% endif %}
|
|
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
|
|
|
|
{% if emails %}
|
|
<h2><i class="fas fa-envelope"></i> EMAILS</h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>EMAIL</th>
|
|
<th>FILE</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for email_dict in emails %}
|
|
<tr>
|
|
<td style="word-break:break-all;">
|
|
{% for em in email_dict|key:"emails" %}
|
|
{{ em }} </br>
|
|
{% endfor %}
|
|
</td>
|
|
|
|
<td style="word-break:break-all;">
|
|
{{email_dict|key:"path"}}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
|
|
{% if trackers|key:"trackers" %}
|
|
<h2><i class="fas fa-user-secret"></i> TRACKERS</h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>TRACKER</th>
|
|
<th>CATEGORIES</th>
|
|
<th>URL</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
{% for trk in trackers|key:"trackers" %}
|
|
<tr>
|
|
<td>
|
|
{{trk.name}}
|
|
</td>
|
|
<td>
|
|
{{trk.categories}}
|
|
</td>
|
|
<td>
|
|
<a target="_blank" href="{{trk.url}}" rel="noopener noreferrer">{{trk.url}}</a>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if secrets %}
|
|
<h2><i class="fas fa-key"></i> HARDCODED SECRETS</h2>
|
|
<table class="basic">
|
|
<thead>
|
|
<tr>
|
|
<th>POSSIBLE SECRETS</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for sec in secrets %}
|
|
<tr>
|
|
<td style="word-break:break-all;">
|
|
{{ sec }}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if not playstore_details.error %}
|
|
<h2><i class="fab fa-google-play"></i> PLAYSTORE INFORMATION </h2>
|
|
|
|
<p>
|
|
<h5>Title:</h5>
|
|
{{ playstore_details.title }}
|
|
</p>
|
|
<p>
|
|
<h5>Score:</h5>
|
|
{{ playstore_details.score}}
|
|
|
|
<h5>Installs:</h5>
|
|
{{ playstore_details.installs }}
|
|
|
|
<h5>Price:</h5>
|
|
{{ playstore_details.price }}
|
|
|
|
<h5>Android Version Support:</h5>
|
|
{{ playstore_details.androidVersionText }}
|
|
|
|
<h5>Category:</h5>
|
|
{{ playstore_details.genre }}
|
|
|
|
<h5>Play Store URL:</h5>
|
|
<a target="_blank" href="{{ playstore_details.url }}" rel="noopener noreferrer"> {{ package_name }} </a>
|
|
</p>
|
|
|
|
<p>
|
|
<h5>Developer Details:</h5>
|
|
{{playstore_details.developer}},
|
|
{{playstore_details.developerId}},
|
|
{{playstore_details.developerAddress }},
|
|
{{playstore_details.developerWebsite}},
|
|
{{playstore_details.developerEmail}},
|
|
</p>
|
|
<p>
|
|
<h5>Release Date:</h5>
|
|
{{ playstore_details.released }}
|
|
<h5>Privacy Policy:</h5>
|
|
<a target="_blank" href="{{ playstore_details.privacyPolicy }}" rel="noopener noreferrer">Privacy link</a>
|
|
</p>
|
|
<p>
|
|
<h5>Description:</h5>
|
|
<p>{{ playstore_details.description }}</p>
|
|
</p>
|
|
|
|
{% endif %}
|
|
</article>
|
|
<article id="columns">
|
|
</br>
|
|
<hr>
|
|
<h3>Report Generated by - MobSF {{ version }} </h3>
|
|
<section>
|
|
<p>
|
|
Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis.
|
|
</p>
|
|
<p>
|
|
<strong>© {% now "Y" %} Mobile Security Framework - MobSF | <a href="https://ajinabraham.com">Ajin Abraham</a> | <a href="https://opensecurity.in">OpenSecurity</a>.</strong>
|
|
</p>
|
|
</section>
|
|
</article>
|
|
</body>
|
|
</html>
|
|
{% endblock %}
|