J. W. de Bakker

59 papers A* 11B 5Journal 19Unranked 12
YearRankTypeTitle / Venue / Authors
2000 J jnl
Theor. Comput. Sci.
Marcello M. Bonsangue, Farhad Arbab, J. W. de Bakker, Jan J. M. M. Rutten, A. Secutella, Gianluigi Zavattaro
2000 conf
MFCSIT
J. W. de Bakker
2000 conf
MFCSIT
Jerry den Hartog, Erik P. de Vink, J. W. de Bakker
1999 J jnl
Fundam. Informaticae
Jerry den Hartog, Erik P. de Vink, J. W. de Bakker
1995 conf
STRICT
J. W. de Bakker
1994 ed.
REX Workshop
J. W. de Bakker, Willem P. de Roever, Grzegorz Rozenberg
1994 J jnl
Fundam. Informaticae
J. W. de Bakker, Erik P. de Vink
1994 J jnl
Inf. Comput.
Eiichi Horita, J. W. de Bakker, Jan J. M. M. Rutten
1993 B conf
MFCS
J. W. de Bakker, Franck van Breugel, Arie de Bruin
1993 J jnl
New Gener. Comput.
J. W. de Bakker, Erik P. de Vink
1993 ed.
REX Workshop
J. W. de Bakker, Willem P. de Roever, Grzegorz Rozenberg
1993 B conf
MFPS
J. W. de Bakker, Franck van Breugel
1992 ed.
REX Workshop
J. W. de Bakker, Cornelis Huizing, Willem P. de Roever, Grzegorz Rozenberg
1991 conf
TAPSOFT, Vol.2
J. W. de Bakker, Erik P. de Vink
1991 J jnl
Inf. Comput.
J. W. de Bakker
1991 ed.
REX Workshop
J. W. de Bakker, Willem P. de Roever, Grzegorz Rozenberg
1991 J jnl
Theor. Comput. Sci.
J. W. de Bakker, J. H. A. Warmerdam
1991 conf
PARLE (2)
J. W. de Bakker, Erik P. de Vink
1990 J jnl
Theor. Comput. Sci.
J. W. de Bakker, Joost N. Kok
1990 conf
Semantics of Systems of Concurrent Processes
J. W. de Bakker, J. H. A. Warmerdam
1990 ed.
REX Workshop
J. W. de Bakker, Willem P. de Roever, Grzegorz Rozenberg
1989 conf
IFIP Congress
J. W. de Bakker
1989 ed.
REX Workshop
J. W. de Bakker, Willem P. de Roever, Grzegorz Rozenberg
1988 J jnl
BIT
J. W. de Bakker, John-Jules Ch. Meyer
1988 J jnl
J. Comput. Syst. Sci.
J. W. de Bakker, John-Jules Ch. Meyer, Ernst-Rüdiger Olderog, Jeffery I. Zucker
1988 conf
FGCS
J. W. de Bakker, Joost N. Kok
1987 J jnl
Theor. Comput. Sci.
J. W. de Bakker, John-Jules Ch. Meyer, Ernst-Rüdiger Olderog
1987 J jnl
Acta Informatica
J. W. de Bakker, John-Jules Ch. Meyer
1987 ed.
PARLE
J. W. de Bakker, A. J. Nijman, Philip C. Treleaven
1987 ed.
PARLE
J. W. de Bakker, A. J. Nijman, Philip C. Treleaven
1986 ch.
Current Trends in Concurrency
J. W. de Bakker, Joost N. Kok, John-Jules Ch. Meyer, Ernst-Rüdiger Olderog, Jeffery I. Zucker
1986 book
Current Trends in Concurrency
J. W. de Bakker, Willem P. de Roever, Grzegorz Rozenberg
1985 A* conf
ICALP
J. W. de Bakker, John-Jules Ch. Meyer, Ernst-Rüdiger Olderog
1985 A* conf
ICALP
J. W. de Bakker, Joost N. Kok
1985 A* conf
STOC
J. W. de Bakker, John-Jules Ch. Meyer, Ernst-Rüdiger Olderog, Jeffery I. Zucker
1984 J jnl
Theor. Comput. Sci.
J. W. de Bakker, Jan A. Bergstra, Jan Willem Klop, John-Jules Ch. Meyer
1984 J jnl
Theor. Comput. Sci.
J. W. de Bakker, John-Jules Ch. Meyer, Jeffery I. Zucker
1983 conf
Logic of Programs
J. W. de Bakker, Jeffery I. Zucker
1983 A* conf
ICALP
J. W. de Bakker, Jan A. Bergstra, Jan Willem Klop, John-Jules Ch. Meyer
1983 J jnl
Theor. Comput. Sci.
J. W. de Bakker, John-Jules Ch. Meyer, Jeffery I. Zucker
1983 A* conf
ICALP
J. W. de Bakker, Jeffery I. Zucker
1982 A* conf
STOC
J. W. de Bakker, Jeffery I. Zucker
1982 J jnl
Inf. Control.
J. W. de Bakker, Jeffery I. Zucker
1981 conf
Logic of Programs
J. W. de Bakker, Jan Willem Klop, John-Jules Ch. Meyer
1980 A* ed.
ICALP
J. W. de Bakker, Jan van Leeuwen
1979 B conf
MFCS
J. W. de Bakker
1977 A* conf
ICALP
Krzysztof R. Apt, J. W. de Bakker
1977 conf
IFIP Congress
J. W. de Bakker
1977 B conf
MFCS
J. W. de Bakker
1976 B conf
MFCS
Krzysztof R. Apt, J. W. de Bakker
1976 J jnl
Theor. Comput. Sci.
J. W. de Bakker
1976 A* conf
ICALP
J. W. de Bakker
1975 A* conf
FOCS
J. W. de Bakker
1975 conf
Lambda-Calculus and Computer Science Theory
J. W. de Bakker
1975 J jnl
J. Comput. Syst. Sci.
J. W. de Bakker, Lambert G. L. T. Meertens
1972 A* conf
ICALP
J. W. de Bakker, Willem P. de Roever
1971 ch.
Symposium on Semantics of Algorithmic Languages
J. W. de Bakker
1971 ch.
Symposium on Semantics of Algorithmic Languages
J. W. de Bakker
1966 J jnl
Commun. ACM
J. W. de Bakker
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"