Ike Kunze

39 papers A 3B 8C 1Journal 14Unranked 13
YearRankTypeTitle / Venue / Authors
2025 B conf
NOMS
Ina Berenice Fink, Ike Kunze, Pascal Hein, Jan Pennekamp, Benjamin Standaert, Klaus Wehrle, Jan Rüth
2025 conf
ANRW
Kathrin Elmenhorst, Mirja Kühlewind, Ike Kunze, Constantin Sander, Klaus Wehrle
2025 B conf
NOMS
Jan Pennekamp, Paul Weiler, Matthias Bodenbenner, Maximilian Sudmann, István Koren, Ike Kunze, Marcel Fey, Dominik Wolfschläger, Christian Brecher, Robert H. Schmitt, Klaus Wehrle
2025 B conf
NOMS
Ike Kunze, Constantin Sander, Mike Kosek, Lars Tissen, Jan Pennekamp, Klaus Wehrle
2025 J jnl
CoRR
Ike Kunze, Dominik Scheurenberg, Liam Tirpitz, Sandra Geisler, Klaus Wehrle
2025 conf
DEBS
Liam Tirpitz, Ike Kunze, Philipp Niemietz, Anna Kathrin Gerhardus, Thomas Bergs, Klaus Wehrle, Sandra Geisler
2025 J jnl
RFC
Ike Kunze, Klaus Wehrle, Dirk Trossen, Marie-José Montpetit, Xavier de Foy, David Griffin, Miguel Rio
2025 conf
ANRW
Ike Kunze, Constantin Sander, Alexander Ruhrmann, Niklas Rieken, Klaus Wehrle
2025 B conf
Networking
Constantin Sander, Ike Kunze, Dario Veltri, Klaus Wehrle
2024 conf
ICPS
Ike Kunze, Dominik Scheurenberg, Liam Tirpitz, Sandra Geisler, Klaus Wehrle
2024 A conf
AsiaCCS
Eric Wagner, David Heye, Martin Serror, Ike Kunze, Klaus Wehrle, Martin Henze
2024 B conf
NOMS
Ike Kunze, Constantin Sander, Lars Tissen, Benedikt Bode, Klaus Wehrle
2023 A conf
IMC
Ike Kunze, Constantin Sander, Klaus Wehrle
2023 J jnl
CoRR
Ike Kunze, Constantin Sander, Klaus Wehrle
2023 A conf
IMC
Constantin Sander, Ike Kunze, Leo Blöcher, Mike Kosek, Klaus Wehrle
2023 J jnl
CoRR
Constantin Sander, Ike Kunze, Leo Blöcher, Mike Kosek, Klaus Wehrle
2023 J jnl
CoRR
Jan Pennekamp, Anastasiia Belova, Thomas Bergs, Matthias Bodenbenner, Andreas Bührig-Polaczek, Markus Dahlmanns, Ike Kunze, Moritz Kröger, Sandra Geisler, Martin Henze, Daniel Lütticke, Benjamin Montavon, Philipp Niemietz, Lucia Ortjohann, Maximilian Rudack, Robert H. Schmitt, Uwe Vroomen, Klaus Wehrle, Michael Zeng
2023 conf
TMA
Laurenz Grote, Ike Kunze, Constantin Sander, Klaus Wehrle
2023 J jnl
CoRR
Eric Wagner, David Heye, Martin Serror, Ike Kunze, Klaus Wehrle, Martin Henze
2022 J jnl
ACM Trans. Internet Things
Philipp Brauner, Manuela Dalibor, Matthias Jarke, Ike Kunze, István Koren, Gerhard Lakemeyer, Martin Liebenberg, Judith Michael, Jan Pennekamp, Christoph Quix, Bernhard Rumpe, Wil M. P. van der Aalst, Klaus Wehrle, Andreas Wortmann, Martina Ziefle
2022 conf
TMA
Constantin Sander, Ike Kunze, Klaus Wehrle
2022 B conf
ICNP
Ike Kunze, Dirk Trossen, Klaus Wehrle
2021 J jnl
CoRR
Jan Pennekamp, Erik Buchholz, Markus Dahlmanns, Ike Kunze, Stefan Braun, Eric Wagner, Matthias Brockmann, Klaus Wehrle, Martin Henze
2021 conf
ISIE
Ike Kunze, Philipp Niemietz, Liam Tirpitz, René Glebke, Daniel Trauth, Thomas Bergs, Klaus Wehrle
2021 conf
ICPS
Ike Kunze, René Glebke, Jan Scheiper, Matthias Bodenbenner, Robert H. Schmitt, Klaus Wehrle
2021 J jnl
CoRR
Ike Kunze, Klaus Wehrle, Jan Rüth
2021 conf
ANRW
Ike Kunze, Klaus Wehrle, Jan Rüth
2021 C conf
HPSR
René Glebke, Dirk Trossen, Ike Kunze, David Lou, Jan Rüth, Mirko Stoffers, Klaus Wehrle
2021 B conf
IM
Ike Kunze, Moritz Gunz, David Saam, Klaus Wehrle, Jan Rüth
2021 J jnl
CoRR
Ike Kunze, Constantin Sander, Klaus Wehrle, Jan Rüth
2021 conf
EPIQ@CoNEXT
Ike Kunze, Constantin Sander, Klaus Wehrle, Jan Rüth
2021 B conf
PAM
Constantin Sander, Ike Kunze, Klaus Wehrle, Jan Rüth
2021 J jnl
CoRR
Constantin Sander, Ike Kunze, Klaus Wehrle, Jan Rüth
2020 J jnl
IEEE Trans. Netw. Serv. Manag.
Ike Kunze, Jan Rüth, Oliver Hohlfeld
2020 conf
UR
Samuel Mann, René Glebke, Ike Kunze, Dominik Scheurenberg, Rahul Sharma, Uwe Reisgen, Klaus Wehrle, Dirk Abel
2019 conf
TMA
Jan Rüth, Ike Kunze, Oliver Hohlfeld
2019 J jnl
CoRR
Jan Rüth, Ike Kunze, Oliver Hohlfeld
2019 J jnl
IEEE Trans. Netw. Serv. Manag.
Jan Rüth, Ike Kunze, Oliver Hohlfeld
2019 conf
ENCP@CoNEXT
René Glebke, Johannes Krude, Ike Kunze, Jan Rüth, Felix Senger, Klaus Wehrle
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"