Natalia Beloff

49 papers B 1C 16Journal 4Unranked 27
YearRankTypeTitle / Venue / Authors
2025 C conf
FedCSIS
Samah Almaghrabi, Natalia Beloff, Martin White
2025 C conf
FedCSIS
Mona Alshehri, Natalia Beloff, Martin White
2025 C conf
FedCSIS
Maysoon Bineid, Natalia Beloff, Anastasia Khanina, Martin White
2025 C conf
FedCSIS
Saleh Z. Alshehri, Natalia Beloff, Martin White
2025 J jnl
IET Blockchain
Ahmed Alrehaili, Martin White, Natalia Beloff
2025 J jnl
CoRR
Bo Wang, Imran Khan, Martin White, Natalia Beloff
2024 C conf
FedCSIS
Fayez Alshahrani, Natalia Beloff, Martin White
2024 conf
SAI (2)
Mona Alshehri, Natalia Beloff, Martin White
2024 C conf
FedCSIS
Wafa Alshammari, Natalia Beloff, Martin White
2024 conf
FedCSIS (Communication Papers)
Yahya Almazni, Natalia Beloff, Martin White
2024 conf
FedCSIS (Communication Papers)
Rasha Alsulami, Natalia Beloff, Martin White
2024 C conf
FedCSIS
Mohammed Alqahtani, Natalia Beloff, Martin White
2024 C conf
FedCSIS
Taif Ghiwaa, Imran Khan, Martin White, Natalia Beloff
2024 C conf
FedCSIS
Amal Alzahrani, Natalia Beloff, Martin White
2024 C conf
FedCSIS
Ahmad Alghamdi, Natalia Beloff, Martin White
2023 conf
FedCSIS (Position Papers)
Fayez Alshahrani, Natalia Beloff, Martin White
2023 C conf
FedCSIS
Maysoon Bineid, Natalia Beloff, Martin White, Anastasia Khanina
2023 conf
FedCSIS (Communication Papers)
Yahya Alqahtani, Natalia Beloff, Martin White
2023 conf
FedCSIS (Position Papers)
Abdulrahman Alsaif, Imran Khan, Martin White, Natalia Beloff
2023 C conf
FedCSIS
Hamad Almansour, Natalia Beloff, Martin White
2022 conf
SAI (3)
Rituparna Bhattacharya, Martin White, Natalia Beloff
2022 conf
IntelliSys (1)
Mohammed Alqahtani, Natalia Beloff, Martin White
2022 conf
IntelliSys (1)
Ahmad Alghamdi, Natalia Beloff, Martin White
2022 conf
IntelliSys (1)
Yahya Almazni, Natalia Beloff, Martin White
2022 conf
IntelliSys (3)
Manal Alkhammash, Natalia Beloff, Martin White
2022 conf
IntelliSys (1)
Hamad Almansour, Natalia Beloff, Martin White
2022 conf
Blockchain
Monirah Ali Aleisa, Mona Alshahrani, Natalia Beloff, Martin White
2022 conf
SAI (3)
Rituparna Bhattacharya, Martin White, Natalia Beloff
2021 conf
IntelliSys (3)
Monirah Ali Aleisa, Natalia Beloff, Martin White
2021 conf
SAI (2)
Rituparna Bhattacharya, Martin White, Natalia Beloff
2021 conf
SAI (1)
Naif Al Mudawi, Natalia Beloff, Martin White
2021 J jnl
Cryptogr.
Bayan Ibrahimm Alabdullah, Natalia Beloff, Martin White
2020 conf
FedCSIS (Position Papers)
Yahya Alqahtani, Natalia Beloff, Martin White
2020 conf
SAI (2)
Manal Alkhammash, Natalia Beloff, Martin White
2020 conf
SAI (3)
Sunday Alabi, Martin White, Natalia Beloff
2020 conf
ICIIT
Zehra Ozge Yildiz, Natalia Beloff
2019 conf
SmartWorld/SCALCOM/UIC/ATC/CBDCom/IOP/SCI
Naif Al Mudawi, Natalia Beloff, Martin White
2019 C conf
FedCSIS
Mohammed Alonazi, Natalia Beloff, Martin White
2019 C conf
FedCSIS
Mohammed Alonazi, Natalia Beloff, Martin White
2019 conf
AITM/ISM@FedCSIS
Mohammed Alonazi, Natalia Beloff, Martin White
2016 conf
EUSPN/ICTH
Steve Huckle, Rituparna Bhattacharya, Martin White, Natalia Beloff
2015 ch.
Health Monitoring and Personalized Feedback using Multimedia Data
Sheena Dungey, Natalia Beloff, Rachael Williams, Timothy Williams, Shivani Puri, Anne Rosemary Tate
2015 C conf
FedCSIS
Saleh Alghamdi, Natalia Beloff
2014 conf
BHI
Sheena Dungey, Natalia Beloff, Shivani Puri, Rachael Boggon, Timothy Williams, Anne Rosemary Tate
2014 conf
BHI
Anne Rosemary Tate, Dipak Kalra, Rachael Boggon, Natalia Beloff, Shivani Puri, Timothy Williams
2014 J jnl
J. Am. Medical Informatics Assoc.
Anne Rosemary Tate, Natalia Beloff, Balques Al-Radwan, Joss Wickson, Shivani Puri, Timothy Williams, Tjeerd Pieter van Staa, Adrian Bleach
2014 conf
PECCS
Leon Barker, Martin White, Mairead Curran, Zeeshan Patoli, Benji Huggins, Tudor Pascu, Natalia Beloff
2014 C conf
FedCSIS
Saleh Alghamdi, Natalia Beloff
2009 B conf
ASONAM
Abdullah Al-Barakati, Wei Zhang, Zeeshan Patoli, Michael Gkion, Natalia Beloff, Paul F. Newbury, Martin White
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"