Naoto Ishii

26 papers B 8C 1Journal 5Unranked 12
YearRankTypeTitle / Venue / Authors
2025 conf
ECOC
Hiroki Kawahara, Yasuhiro Katsube, Tetsuo Kawakami, Kotaro Ueda, Yu Yu, Toshihiko Okamura, Keisuke Mera, Yoshimichi Tanizawa, Masashi Ito, Mikio Fujiwara, Masahide Sasaki, Wakako Maeda, Naoto Ishii
2025 conf
ECOC
Hiroki Kawahara, Seigo Takahashi, Toshihiko Okamura, Wakako Maeda, Naoto Ishii
2025 B conf
WCNC
Fuga Kobayashi, Takumi Takahashi, Shinsuke Ibi, Hideki Ochiai, Kazushi Muraoka, Takanobu Doi, Naoto Ishii
2024 B conf
WCNC
Takanobu Doi, Jun Shikida, Daichi Shirase, Kazushi Muraoka, Naoto Ishii, Takumi Takahashi, Shinsuke Ibi
2024 J jnl
IEEE Access
Masaaki Tanio, Daisaku Ogasahara, Naoto Ishii, Kazushi Muraoka
2023 J jnl
IEICE Trans. Commun.
Takanobu Doi, Jun Shikida, Daichi Shirase, Kazushi Muraoka, Naoto Ishii, Takumi Takahashi, Shinsuke Ibi
2022 J jnl
IEEE Access
Masaaki Tanio, Naoto Ishii, Norifumi Kamiya
2022 conf
VTC Fall
Jun Shikida, Kazushi Muraoka, Toshiki Takeuchi, Naoto Ishii
2022 B conf
WCNC
Takanobu Doi, Jun Shikida, Kazushi Muraoka, Naoto Ishii, Daichi Shirase, Takumi Takahashi, Shinsuke Ibi
2022 conf
VTC Fall
Masaaki Tanio, Naoto Ishii, Kazushi Muraoka
2021 B conf
GLOBECOM
Daichi Shirase, Takumi Takahashi, Shinsuke Ibi, Kazushi Muraoka, Naoto Ishii, Seiichi Sampei
2021 conf
OFC
Shinsuke Fujisawa, Fatih Yaman, Hussam G. Batshon, Masaaki Tanio, Naoto Ishii, Chaoran Huang, Thomas Ferreira de Lima, Yoshihisa Inada, Paul R. Prucnal, Norifumi Kamiya, Ting Wang
2020 J jnl
Cogn. Syst. Res.
Michal Ptaszynski, Fumito Masui, Naoto Ishii
2020 conf
ECOC
Masaki Sato, Hidemi Noguchi, Naoto Ishii, Emmanuel Le Taillandier de Gabory
2020 B conf
GLOBECOM
Daichi Shirase, Takumi Takahashi, Shinsuke Ibi, Kazushi Muraoka, Naoto Ishii, Seiichi Sampei
2020 J jnl
IEEE Access
Masaaki Tanio, Naoto Ishii, Norifumi Kamiya
2020 conf
OFC
Masaki Sato, Hidemi Noguchi, Junichiro Matsui, Jun-ichi Abe, Naoto Ishii, Emmanuel Le Taillandier de Gabory
2019 conf
VTC Spring
Yukihiko Okumura, Satoshi Suyama, Naoto Ishii, Yasushi Maruta, Akihiro Okazaki, Atsushi Okamura, Jun Terada, Takeshi Onizawa
2019 conf
BICA
Michal Ptaszynski, Fumito Masui, Naoto Ishii
2018 conf
VTC Fall
Jun Shikida, Kazushi Muraoka, Naoto Ishii
2017 conf
WSA
Martin Kurras, Lars Thiele, Xiao Peng, Naoto Ishii
2017 conf
VTC Fall
Jun Shikida, Naoto Ishii
2016 C conf
APCC
Jun Shikida, Naoto Ishii, Yoshikazu Kakura
1996 B conf
PIMRC
Naoto Ishii, Ryuji Kohno
1995 B conf
PIMRC
Ryuji Kohno, Naoto Ishii, Minami Nagatsuka
1994 B conf
PIMRC
Naoto Ishii, Ryuji Kohno
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"