Navid Noroozi

40 papers C 1Misc 3Journal 21Unranked 15
YearRankTypeTitle / Venue / Authors
2022 J jnl
Autom.
Navid Noroozi, Andrii Mironchenko, Fabian R. Wirth
2022 J jnl
Eur. J. Control
Navid Noroozi, Andrii Mironchenko, Christoph Kawan, Majid Zamani
2022 J jnl
IEEE Control. Syst. Lett.
Navid Noroozi, Ali Salamati, Majid Zamani
2021 J jnl
IEEE Trans. Autom. Control.
Christoph Kawan, Andrii Mironchenko, Abdalla Swikir, Navid Noroozi, Majid Zamani
2021 conf
CDC
Andrii Mironchenko, Navid Noroozi, Christoph Kawan, Majid Zamani
2021 J jnl
CoRR
Maryam Sharifi, Abdalla Swikir, Navid Noroozi, Majid Zamani
2021 J jnl
CoRR
Maryam Sharifi, Abdalla Swikir, Navid Noroozi, Majid Zamani
2021 J jnl
Syst. Control. Lett.
Andrii Mironchenko, Navid Noroozi, Christoph Kawan, Majid Zamani
2021 J jnl
CoRR
Siyuan Liu, Navid Noroozi, Majid Zamani
2020 conf
CDC
Navid Noroozi, Andrii Mironchenko, Fabian R. Wirth
2020 conf
CDC
Maryam Sharifi, Abdalla Swikir, Navid Noroozi, Majid Zamani
2020 conf
CDC
Mobin Shahamat, Javad Askari, Abdalla Swikir, Navid Noroozi, Majid Zamani
2020 J jnl
Syst. Control. Lett.
Navid Noroozi, Roman Geiselhart, Lars Grüne, Fabian R. Wirth
2020 J jnl
IEEE Trans. Autom. Control.
Navid Noroozi, Roman Geiselhart, Seyed Hossein Mousavi, Romain Postoyan, Fabian R. Wirth
2020 C conf
ACC
Hoang Hai Nguyen, Janine Matschek, Tim Zieger, Anton Savchenko, Navid Noroozi, Rolf Findeisen
2019 conf
CDC
Seyed Hossein Mousavi, Navid Noroozi, Roman Geiselhart, Markus J. Kögel, Rolf Findeisen
2019 conf
CDC
Navid Noroozi, Roxanne Jackson, Daniel E. Quevedo, Fabian R. Wirth, Rolf Findeisen
2018 conf
ECC
Navid Noroozi, Fabian R. Wirth, Majid Zamani
2018 conf
ECC
Navid Noroozi, Abdalla Swikir, Fabian R. Wirth, Majid Zamani
2018 J jnl
Syst. Control. Lett.
Navid Noroozi, S. Hossein Mousavi, Horacio J. Marquez
2018 J jnl
IEEE Trans. Autom. Control.
Navid Noroozi, Roman Geiselhart, Lars Grüne, Björn Rüffer, Fabian R. Wirth
2018 J jnl
CoRR
Seyed Hossein Mousavi, Navid Noroozi, Anton H. J. de Ruiter, Roman Geiselhart
2018 J jnl
Autom.
Stefan H. J. Heijmans, Romain Postoyan, Dragan Nesic, Navid Noroozi, Maurice Heemels
2017 J jnl
Math. Control. Signals Syst.
Navid Noroozi, Alireza Khayatian, Roman Geiselhart
2017 J jnl
Autom.
Roman Geiselhart, Navid Noroozi
2016 J jnl
J. Vis. Commun. Image Represent.
Navid Noroozi, Ali Zakerolhosseini
2016 J jnl
Comput. Biol. Medicine
Navid Noroozi, Ali Zakerolhosseini
2016 J jnl
Int. J. Syst. Sci.
Navid Noroozi, Alireza Khayatian, Saeed Ahmadizadeh, Hamid Reza Karimi
2016 conf
CDC
Navid Noroozi, Romain Postoyan, Dragan Nesic, Stefan H. J. Heijmans, W. P. Maurice H. Heemels
2016 conf
CDC
Stefan H. J. Heijmans, Romain Postoyan, Navid Noroozi, Dragan Nesic, W. P. M. H. Heemels
2014 J jnl
Autom.
Navid Noroozi, Dragan Nesic, Andrew R. Teel
2014 conf
CDC
Navid Noroozi, Björn Sebastian Rüffer
2010 Misc conf
IRI
Shabnam Pourdehi, Dena Karimipour, Navid Noroozi, Fereidoon Shabaninia
2010 J jnl
Pattern Recognit. Lett.
Sara Hashemi, Soheila Kiani, Navid Noroozi, Mohsen Ebrahimi Moghaddam
2010 Misc conf
IRI
Ehsan Moshksar, Faridoon Shabaninia, Navid Noroozi
2010 conf
CDC
Ebadat Ebadat, Navid Noroozi, Ali Akbar Safavi, S. Hossein Mousavi
2009 conf
ICDIP
Sara Hashemi, Soheila Kiani, Navid Noroozi, Mohsen Ebrahimi Moghaddam
2009 conf
ICONS
Navid Noroozi, Paknosh Karimaghaee, Ali Akbar Safavi, Amit Bhaya
2009 Misc conf
SACI
Navid Noroozi, Mehdi Roopaei, Valentina Emilia Balas, Tsung-Chih Lin
2009 conf
CDC
Navid Noroozi, Paknosh Karimaghaee, Ali Akbar Safavi, Amit Bhaya
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"