Radu Badea

35 papers B 5C 3Misc 1Journal 13Unranked 13
YearRankTypeTitle / Venue / Authors
2024 conf
AQTR
Delia Mitrea, Raluca Brehar, Razvan Itu, Sergiu Nedevschi, Mihai Adrian Socaciu, Radu Badea
2023 J jnl
Sensors
Delia Alexandrina Mitrea, Raluca Brehar, Sergiu Nedevschi, Monica Lupsor Platon, Mihai Adrian Socaciu, Radu Badea
2023 conf
TSP
Delia Mitrea, Raluca Brehar, Cristinel Mocan, Sergiu Nedevschi, Mihai Adrian Socaciu, Radu Badea
2023 conf
ICSAI
Delia Mitrea, Vlad Timu, Cristinel Mihai Mocan, Sergiu Nedevschi, Andrei-Vlad Florian, Mihai Adrian Socaciu, Radu Badea
2021 J jnl
Sensors
Delia Mitrea, Radu Badea, Paulina Mitrea, Stelian Brad, Sergiu Nedevschi
2020 B conf
ICCP
Dan-Sebastian Bacea, Delia Alexandrina Mitrea, Sergiu Nedevschi, Radu Badea
2020 J jnl
Sensors
Raluca Brehar, Delia Alexandrina Mitrea, Flaviu Ionut Vancea, Tiberiu Marita, Sergiu Nedevschi, Monica Lupsor Platon, Magda Rotaru, Radu Badea
2019 conf
CISP-BMEI
Delia Mitrea, Sergiu Nedevschi, Paulina Mitrea, Monica Platon-Lupsor, Radu Badea
2019 B conf
ICCP
Raluca Brehar, Delia Mitrea, Sergiu Nedevschi, Monica Platon-Lupsor, Magda Rotaru, Radu Badea
2019 B conf
ICCP
Flaviu Ionut Vancea, Delia Mitrea, Sergiu Nedevschi, Magda Rotaru, Horia Stefanescu, Radu Badea
2018 C conf
ICPRAM
Delia Mitrea, Sergiu Nedevschi, Radu Badea
2017 J jnl
IEEE Commun. Mag.
Ioanna Kakalou, Kostas E. Psannis, Piotr Krawiec, Radu Badea
2017 conf
CISP-BMEI
Delia Mitrea, Sergiu Nedevschi, Paulina Mitrea, Monica Platon-Lupsor, Radu Badea
2016 conf
EPS
Delia Mitrea, Sergiu Nedevschi, Monica Platon-Lupsor, Radu Badea
2016 C conf
ICPRAM
Delia Mitrea, Sergiu Nedevschi, Radu Badea
2015 conf
TSP
Delia Mitrea, Sergiu Nedevschi, Mihail Abrudean, Radu Badea
2014 conf
COMM
Vlad Poenaru, Serban Georgica Obreja, Radu Badea, Eugen Borcoci
2014 C conf
ICPRAM
Delia Mitrea, Sergiu Nedevschi, Radu Badea
2014 conf
AQTR
Alexandru Ioan Mitrea, Sergiu Nedevschi, Delia Mitrea, Paulina Mitrea, Radu Badea
2013 J jnl
Comput. Math. Methods Medicine
Carlo Cattani, Radu Badea, Shengyong Chen, Maria Crisan
2013 conf
TSP
Delia Mitrea, Monica Lupsor Platon, Sergiu Nedevschi, Radu Badea
2012 J jnl
Comput. Math. Methods Medicine
Delia Alexandrina Mitrea, Paulina Mitrea, Sergiu Nedevschi, Radu Badea, Monica Lupsor, Mihai Adrian Socaciu, Adela Golea, Claudia Hagiu, Lidia Ciobanu
2012 J jnl
Comput. Math. Methods Medicine
Carlo Cattani, Radu Badea, Shengyong Chen, Maria Crisan
2012 J jnl
Comput. Math. Methods Medicine
Cristian Vicas, Monica Lupsor, Mihai Adrian Socaciu, Sergiu Nedevschi, Radu Badea
2012 J jnl
Expert Syst. Appl.
Florin Gorunescu, Smaranda Belciug, Marina Gorunescu, Radu Badea
2012 J jnl
Comput. Math. Methods Medicine
Alexandru Ioan Mitrea, Radu Badea, Delia Alexandrina Mitrea, Sergiu Nedevschi, Paulina Mitrea, Dumitru Mircea Ivan, Octavian Mircia Gurzau
2012 J jnl
Comput. Math. Methods Medicine
Maria Crisan, Guido Cappare, Luciana Neamtiu, Ioana Chiorean, Liana Lupsa, Diana Crisan, Radu Badea
2012 Misc conf
SYNASC
Delia Mitrea, Sergiu Nedevschi, Radu Badea
2011 J jnl
Artif. Intell. Medicine
Ruxandra Stoean, Catalin Stoean, Monica Lupsor, Horia Stefanescu, Radu Badea
2011 J jnl
Comput. Biol. Medicine
Catalin Stoean, Ruxandra Stoean, Monica Lupsor, Horia Stefanescu, Radu Badea
2011 B conf
ICCP
Cristian Vicas, Monica Lupsor, Mihai Adrian Socaciu, Radu Badea, Sergiu Nedevschi
2011 conf
ICDIPC (1)
Delia Mitrea, Sergiu Nedevschi, Mihai Adrian Socaciu, Radu Badea
2011 B conf
ICCP
Delia Mitrea, Sergiu Nedevschi, Radu Badea
2011 conf
TSP
Delia Mitrea, Sergiu Nedevschi, Radu Badea
2010 conf
ICCSA (2)
Maria Crisan, Carlo Cattani, Radu Badea, Paulina Mitrea, Mira Florea, Diana Crisan, Delia Mitrea, Razvan Bucur, Gabriela Checiches
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"