Naif Mohammed Alotaibi

21 papers Journal 21
YearRankTypeTitle / Venue / Authors
2026 J jnl
Frontiers Bioinform.
Sumaiya Binte Shahid, Maleeha Kaikaus, Md. Hasanul Kabir, Mohammad Abu Yousuf, A. K. M. Azad, Asmaa S. Al-Moisheer, Naif Mohammed Alotaibi, Salem A. Alyami, Touhid Bhuiyan, Mohammad Ali Moni
2024 J jnl
Reliab. Eng. Syst. Saf.
Philip A. Scarf, Naif Mohammed Alotaibi, Cristiano A. V. Cavalcante, Yan R. Melo, Augusto José da Silva Rodrigues
2023 J jnl
Inf.
Md. Jamal Uddin, Md. Martuza Ahamad, Md. Nesarul Hoque, Md. Abul Ala Walid, Sakifa Aktar, Naif Mohammed Alotaibi, Salem A. Alyami, Muhammad Ashad Kabir, Mohammad Ali Moni
2023 J jnl
IEEE Access
Showmick Guha Paul, Arpa Saha, Mohammad Shamsul Arefin, Touhid Bhuiyan, Al Amin Biswas, Ahmed Wasif Reza, Naif Mohammed Alotaibi, Salem A. Alyami, Mohammad Ali Moni
2023 J jnl
IET Image Process.
Md. Masud Rana, Md. Manowarul Islam, Md. Alamin Talukder, Md. Ashraf Uddin, Sunil Aryal, Naif Mohammed Alotaibi, Salem A. Alyami, Khondokar Fida Hasan, Mohammad Ali Moni
2023 J jnl
Comput.
Md. Jamal Uddin, Md. Martuza Ahamad, Prodip Kumar Sarker, Sakifa Aktar, Naif Mohammed Alotaibi, Salem A. Alyami, Muhammad Ashad Kabir, Mohammad Ali Moni
2023 J jnl
Axioms
Naif Mohammed Alotaibi, Asmaa S. Al-Moisheer, Ibrahim Elbatal, Mansour Shrahili, Mohammed Elgarhy, Ehab M. Almetwally
2023 J jnl
Sensors
Md. Mehedi Hasan, Md. Azam Hossain, Naif Mohammed Alotaibi, John F. Arnold, A. K. M. Azad
2023 J jnl
Reliab. Eng. Syst. Saf.
Naif Mohammed Alotaibi, Philip Scarf, Cristiano A. V. Cavalcante, Rodrigo Sampaio Lopes, André Luiz de Oliveira e Silva, Augusto José da Silva Rodrigues, Salem A. Alyami
2023 J jnl
Symmetry
Naif Mohammed Alotaibi, Ibrahim Elbatal, Mansour Shrahili, Asmaa S. Al-Moisheer, Mohammed Elgarhy, Ehab M. Almetwally
2022 J jnl
Axioms
Ibrahim Elbatal, Sadaf Khan, Tassaddaq Hussain, Mohammed Elgarhy, Naif Mohammed Alotaibi, Hatem E. Semary, Mahmoud M. Abdelwahab
2022 J jnl
Symmetry
Naif Mohammed Alotaibi, Ibrahim Elbatal, Ehab M. Almetwally, Salem A. Alyami, Asmaa S. Al-Moisheer, Mohammed Elgarhy
2022 J jnl
Comput. Stat.
Mohamed S. Abdallah, Amer Ibrahim Al-Omari, Naif Mohammed Alotaibi, Ghadah Alomani, Asmaa S. Al-Moisheer
2022 J jnl
Axioms
Salem A. Alyami, Mohammed Elgarhy, Ibrahim Elbatal, Ehab M. Almetwally, Naif Mohammed Alotaibi, Ahmed R. El-Saeed
2022 J jnl
Entropy
Naif Mohammed Alotaibi, Atef F. Hashem, Ibrahim Elbatal, Salem A. Alyami, Asmaa S. Al-Moisheer, Mohammed Elgarhy
2022 J jnl
Symmetry
Ibrahim Elbatal, Naif Mohammed Alotaibi, Ehab M. Almetwally, Salem A. Alyami, Mohammed Elgarhy
2022 J jnl
Symmetry
Salem A. Alyami, Moolath Girish Babu, Ibrahim Elbatal, Naif Mohammed Alotaibi, Mohammed Elgarhy
2020 J jnl
Symmetry
Mansour Shrahili, Naif Mohammed Alotaibi
2020 J jnl
Complex.
Mansour Shrahili, Naif Mohammed Alotaibi, Devendra Kumar, A. R. Shafay
2019 J jnl
Reliab. Eng. Syst. Saf.
Ibrahim Nafisah, Mansour Shrahili, Naif Mohammed Alotaibi, Philip A. Scarf
2010 J jnl
Appl. Math. Comput.
Saleh M. Hassan, Naif Mohammed Alotaibi
redb/extractors/apk_extractors/apk_permissions.py
← Index redb/extractors/apk_extractors/apk_permissions.py python
import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKPermissions, APKPermission

# Known dangerous permissions (Android runtime permissions)
DANGEROUS_PERMISSIONS = {
    "android.permission.READ_CALENDAR",
    "android.permission.WRITE_CALENDAR",
    "android.permission.CAMERA",
    "android.permission.READ_CONTACTS",
    "android.permission.WRITE_CONTACTS",
    "android.permission.GET_ACCOUNTS",
    "android.permission.ACCESS_FINE_LOCATION",
    "android.permission.ACCESS_COARSE_LOCATION",
    "android.permission.ACCESS_BACKGROUND_LOCATION",
    "android.permission.RECORD_AUDIO",
    "android.permission.READ_PHONE_STATE",
    "android.permission.READ_PHONE_NUMBERS",
    "android.permission.CALL_PHONE",
    "android.permission.ANSWER_PHONE_CALLS",
    "android.permission.ADD_VOICEMAIL",
    "android.permission.USE_SIP",
    "android.permission.BODY_SENSORS",
    "android.permission.SEND_SMS",
    "android.permission.RECEIVE_SMS",
    "android.permission.READ_SMS",
    "android.permission.RECEIVE_WAP_PUSH",
    "android.permission.RECEIVE_MMS",
    "android.permission.READ_EXTERNAL_STORAGE",
    "android.permission.WRITE_EXTERNAL_STORAGE",
    "android.permission.READ_MEDIA_IMAGES",
    "android.permission.READ_MEDIA_VIDEO",
    "android.permission.READ_MEDIA_AUDIO",
    "android.permission.POST_NOTIFICATIONS",
    "android.permission.NEARBY_WIFI_DEVICES",
    "android.permission.ACTIVITY_RECOGNITION",
    "android.permission.BLUETOOTH_SCAN",
    "android.permission.BLUETOOTH_ADVERTISE",
    "android.permission.BLUETOOTH_CONNECT",
}


class APKPermissionsExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.permissions_data = None
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.APK_PERMISSIONS.value

    def _get_protection_level(self, perm_name):
        """Determine the protection level of a permission.

        Uses androguard's permission mappings first, falls back to the
        known dangerous list.
        """
        try:
            from androguard.core.api_specific_resources import load_permission_mappings
            target_sdk = self.apk.get_target_sdk_version()
            sdk = int(target_sdk) if target_sdk else 30
            permission_map = load_permission_mappings(sdk)
            if perm_name in permission_map:
                info = permission_map[perm_name]
                if isinstance(info, dict):
                    return info.get("protectionLevel", "unknown")
                return "unknown"
        except Exception:
            pass

        # Fallback to known dangerous set
        if perm_name in DANGEROUS_PERMISSIONS:
            return "dangerous"
        if perm_name.startswith("android.permission."):
            return "normal"
        return "unknown"

    def _compute_permhash(self):
        """Compute permhash using the permhash library."""
        try:
            from permhash.functions import permhash_apk
            return permhash_apk(self.filepath)
        except Exception as e:
            self.log.warning(f"Failed to compute permhash: {e}")
            return None

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK permissions field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        requested_perms = self._safe_extract(
            "requested_permissions",
            lambda: list(self.apk.get_permissions() or []), []
        )
        custom_perms = self._safe_extract(
            "custom_permissions",
            lambda: list(self.apk.get_declared_permissions() or []), []
        )
        custom_perm_set = set(custom_perms)

        permission_details = []
        dangerous_permissions = []

        for perm in requested_perms:
            try:
                protection_level = self._get_protection_level(perm)
                is_custom = perm in custom_perm_set

                permission_details.append(APKPermission(
                    permission_name=perm,
                    protection_level=protection_level,
                    is_custom=is_custom,
                ))

                if protection_level == "dangerous":
                    dangerous_permissions.append(perm)
            except Exception as e:
                self.log.warning(
                    f"Error processing permission '{perm}' for "
                    f"{self.hash.sha256}: {e}"
                )
                permission_details.append(APKPermission(
                    permission_name=perm,
                    protection_level="unknown",
                    is_custom=perm in custom_perm_set,
                ))

        permhash_value = self._compute_permhash()

        self.permissions_data = APKPermissions(
            total_permission_count=len(requested_perms),
            dangerous_permission_count=len(dangerous_permissions),
            permissions=requested_perms,
            dangerous_permissions=dangerous_permissions,
            custom_permissions=custom_perms,
            permission_details=permission_details,
            permhash=permhash_value,
        )
        return self.permissions_data

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.permissions_data:
                return None

            current_time = datetime.now(timezone.utc)

            # One row per permission
            data = []
            for detail in self.permissions_data.permission_details:
                data.append([
                    self.sha256,
                    detail.permission_name,
                    detail.protection_level,
                    int(detail.is_custom),
                    current_time,
                ])

            if not data:
                return None

            column_names = [
                'sha256', 'permission_name', 'protection_level',
                'is_custom', 'analysis_date',
            ]

            column_type_names = [
                'FixedString(64)', 'String', 'LowCardinality(String)',
                'UInt8', "DateTime64(3, 'UTC')",
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_apk_permissions"