Malte Renken

55 papers A* 4A 3B 5Journal 35Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
SIAM J. Discret. Math.
Ruben Becker, Arnaud Casteigts, Pierluigi Crescenzi, Bojana Kodric, Michael Raskin, Malte Renken, Viktor Zamaraev
2026 J jnl
CoRR
Till Fluschnik, Amela Pucic, Malte Renken
2025 J jnl
J. Comput. Syst. Sci.
George B. Mertzios, Hendrik Molter, Malte Renken, Paul G. Spirakis, Philipp Zschoche
2024 A* conf
AAAI
Till Fluschnik, Leon Kellerhals, Malte Renken
2024 J jnl
CoRR
Till Fluschnik, Leon Kellerhals, Malte Renken
2024 J jnl
SIAM J. Comput.
Arnaud Casteigts, Michael Raskin, Malte Renken, Viktor Zamaraev
2024 J jnl
J. Comput. Syst. Sci.
Hendrik Molter, Malte Renken, Philipp Zschoche
2024 J jnl
Eur. J. Comb.
Vincent Froese, Malte Renken
2023
Malte Renken
2023 B conf
IPEC
Jaroslav Garvardt, Malte Renken, Jannik Schestag, Mathias Weller
2023 A conf
APPROX/RANDOM
Ruben Becker, Arnaud Casteigts, Pierluigi Crescenzi, Bojana Kodric, Malte Renken, Michael Raskin, Viktor Zamaraev
2023 J jnl
J. Comput. Syst. Sci.
Nicolas Maack, Hendrik Molter, Rolf Niedermeier, Malte Renken
2023 J jnl
SIAM J. Discret. Math.
Matthias Bentert, André Nichterlein, Malte Renken, Philipp Zschoche
2022 A conf
STACS
Eugen Füchsle, Hendrik Molter, Rolf Niedermeier, Malte Renken
2022 J jnl
CoRR
Eugen Füchsle, Hendrik Molter, Rolf Niedermeier, Malte Renken
2022 J jnl
Discret. Appl. Math.
Roman Haag, Hendrik Molter, Rolf Niedermeier, Malte Renken
2022 J jnl
CoRR
Ruben Becker, Arnaud Casteigts, Pierluigi Crescenzi, Bojana Kodric, Malte Renken, Michael Raskin, Viktor Zamaraev
2022 conf
SWAT
Pascal Kunz, Till Fluschnik, Rolf Niedermeier, Malte Renken
2022 conf
SAND
Eugen Füchsle, Hendrik Molter, Rolf Niedermeier, Malte Renken
2022 J jnl
CoRR
Eugen Füchsle, Hendrik Molter, Rolf Niedermeier, Malte Renken
2022 J jnl
CoRR
Vincent Froese, Malte Renken
2021 J jnl
Discret. Comput. Geom.
Vincent Froese, Malte Renken
2021 J jnl
Netw. Sci.
Hendrik Molter, Rolf Niedermeier, Malte Renken
2021 J jnl
CoRR
Pascal Kunz, Till Fluschnik, Rolf Niedermeier, Malte Renken
2021 J jnl
Theor. Comput. Sci.
Klaus Heeger, Anne-Sophie Himmel, Frank Kammer, Rolf Niedermeier, Malte Renken, Andrej Sajenko
2021 B conf
FCT
Nicolas Maack, Hendrik Molter, Rolf Niedermeier, Malte Renken
2021 J jnl
CoRR
Nicolas Maack, Hendrik Molter, Rolf Niedermeier, Malte Renken
2021 A conf
ESA
Leon Kellerhals, Malte Renken, Philipp Zschoche
2021 J jnl
CoRR
Leon Kellerhals, Malte Renken, Philipp Zschoche
2021 J jnl
Comb.
Vincent Froese, Malte Renken
2021 A* conf
FOCS
Arnaud Casteigts, Michael Raskin, Malte Renken, Viktor Zamaraev
2021 B conf
MFCS
Hendrik Molter, Malte Renken, Philipp Zschoche
2021 J jnl
CoRR
Hendrik Molter, Malte Renken, Philipp Zschoche
2021 B conf
MFCS
George B. Mertzios, Hendrik Molter, Malte Renken, Paul G. Spirakis, Philipp Zschoche
2021 J jnl
CoRR
George B. Mertzios, Hendrik Molter, Malte Renken, Paul G. Spirakis, Philipp Zschoche
2021 A* conf
IJCAI
Niclas Boehmer, Vincent Froese, Julia Henkel, Yvonne Lasars, Rolf Niedermeier, Malte Renken
2021 J jnl
CoRR
Niclas Boehmer, Vincent Froese, Julia Henkel, Yvonne Lasars, Rolf Niedermeier, Malte Renken
2021 A* conf
ICALP
Matthias Bentert, André Nichterlein, Malte Renken, Philipp Zschoche
2020 conf
Treewidth, Kernels, and Algorithms
Till Fluschnik, Hendrik Molter, Rolf Niedermeier, Malte Renken, Philipp Zschoche
2020 J jnl
CoRR
Till Fluschnik, Hendrik Molter, Rolf Niedermeier, Malte Renken, Philipp Zschoche
2020 J jnl
Soc. Netw. Anal. Min.
Vincent Froese, Brijnesh J. Jain, Rolf Niedermeier, Malte Renken
2020 B conf
WG
Roman Haag, Hendrik Molter, Rolf Niedermeier, Malte Renken
2020 J jnl
CoRR
Roman Haag, Hendrik Molter, Rolf Niedermeier, Malte Renken
2020 J jnl
CoRR
Arnaud Casteigts, Michael Raskin, Malte Renken, Viktor Zamaraev
2020 J jnl
Theor. Comput. Sci.
Till Fluschnik, Hendrik Molter, Rolf Niedermeier, Malte Renken, Philipp Zschoche
2020 J jnl
CoRR
Matthias Bentert, André Nichterlein, Malte Renken, Philipp Zschoche
2019 J jnl
CoRR
Vincent Froese, Malte Renken
2019 conf
COMPLEX NETWORKS (2)
Vincent Froese, Brijnesh J. Jain, Rolf Niedermeier, Malte Renken
2019 conf
COMPLEX NETWORKS (2)
Hendrik Molter, Rolf Niedermeier, Malte Renken
2019 J jnl
CoRR
Hendrik Molter, Rolf Niedermeier, Malte Renken
2019 J jnl
CoRR
Klaus Heeger, Anne-Sophie Himmel, Frank Kammer, Rolf Niedermeier, Malte Renken, Andrej Sajenko
2019 J jnl
CoRR
Vincent Froese, Malte Renken
2018 J jnl
CoRR
Vincent Froese, Brijnesh J. Jain, Rolf Niedermeier, Malte Renken
2017 conf
OR
Malte Renken, Amin Ahmadi, Ralf Borndörfer, Güvenç Sahin, Thomas Schlechte
2016 conf
OR
Ralf Borndörfer, Oytun Arslan, Ziena Elijazyfer, Hakan Güler, Malte Renken, Güvenç Sahin, Thomas Schlechte
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"