Xiaofeng Zhu

29 papers A* 1Journal 21Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
Neural Networks
Zeyu Zhang, Lu Li, Xingyu Ji, Kaiqi Zhao, Xiaofeng Zhu, Philip S. Yu, Jiawei Li, Maojun Wang
2026 J jnl
Robotics Comput. Integr. Manuf.
Jiewu Leng, Xiaofeng Zhu, Jiahe Li, Zean Liu, Yuanfa Dong, Xueliang Zhou, Changhui Liu, Shuai Zheng, Chao Zhang, Qiang Liu, Xin Chen
2025 J jnl
EURASIP J. Wirel. Commun. Netw.
Xiaofeng Zhu, Qiaosong Fan, Jiaqiang Peng, Yuwen Qian
2025 conf
ICDM (Workshops)
Xiaofeng Zhu, Yunshen Zhou
2025 J jnl
CoRR
Xiaofeng Zhu, Yunshen Zhou
2025 J jnl
CoRR
Ankush Raut, Xiaofeng Zhu, Maria Leonor Pacheco
2025 J jnl
Int. J. Comput. Integr. Manuf.
Douxi Yan, Jiafeng Yang, Xiaofeng Zhu, Jiewu Leng, Ding Zhang, Yuqian Lu, Qiang Liu
2025 conf
BIBM
Qiang Ma, Jinghao Xu, Tengfei Li, Xin Yuan, Xiaofeng Zhu, Xiaoshuang Shi
2025 J jnl
J. Supercomput.
Min Zhong, Ziyang Fu, Hong Liang, Xiaofeng Zhu, Siting Le
2025 A* conf
ICML
Fangwen Wu, Lechao Cheng, Shengeng Tang, Xiaofeng Zhu, Chaowei Fang, Dingwen Zhang, Meng Wang
2025 J jnl
CoRR
Fangwen Wu, Lechao Cheng, Shengeng Tang, Xiaofeng Zhu, Chaowei Fang, Dingwen Zhang, Meng Wang
2024 conf
EMBC
Danqing Hu, Bing Liu, Xiaofeng Zhu, Xudong Lu, Nan Wu
2024 J jnl
CoRR
Danqing Hu, Bing Liu, Xiang Li, Xiaofeng Zhu, Nan Wu
2024 conf
EMBC
Danqing Hu, Bing Liu, Xiaofeng Zhu, Xudong Lu, Nan Wu
2024 J jnl
IEEE Trans. Instrum. Meas.
Hui Zhong, Yu Chen, Dongli Yue, Zhichao Li, Xiaohan Hou, Shuang Wang, Xiaofeng Zhu, Yonghong Cheng
2024 J jnl
CoRR
Zeyu Zhang, Peiyao Zhao, Xin Li, Jiamou Liu, Xinrui Zhang, Junjie Huang, Xiaofeng Zhu
2024 conf
EMBC
Hui Su, Bing Liu, Xiaofeng Zhu, Xudong Lu, Nan Wu, Danqing Hu
2024 J jnl
CoRR
Danqing Hu, Bing Liu, Xiaofeng Zhu, Nan Wu
2024 J jnl
CoRR
Danqing Hu, Shanyuan Zhang, Qing Liu, Xiaofeng Zhu, Bing Liu
2024 J jnl
CoRR
Xiaofeng Zhu, Jaya Krishna Mandivarapu
2024 J jnl
Int. J. Medical Informatics
Danqing Hu, Bing Liu, Xiaofeng Zhu, Xudong Lu, Nan Wu
2024 J jnl
PLoS Comput. Biol.
Zhenxing Guo, Daoyu Duan, Wen Tang, Julia Zhu, William S. Bush, Liangliang Zhang, Xiaofeng Zhu, Fulai Jin, Hao Feng
2023 J jnl
Sensors
Yongzhen Li, Pei Cao, Peng Zhang, Hua Yang, Xiaofeng Zhu, Ruihua Guo
2023 conf
WWW (Companion Volume)
Xiaofeng Zhu, Thomas Lin, Vishal Anand, Matthew Calderwood, Eric Clausen-Brown, Gord Lueck, Wen-Wai Yim, Cheng Wu
2023 J jnl
CoRR
Xiaofeng Zhu, Thomas Lin, Vishal Anand, Matthew Calderwood, Eric Clausen-Brown, Gord Lueck, Wen-Wai Yim, Cheng Wu
2023 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Jiewu Leng, Xiaofeng Zhu, Zhiqiang Huang, Kailin Xu, Zhihong Liu, Qiang Liu, Xin Chen
2023 J jnl
IEEE Trans. Instrum. Meas.
Hui Zhong, Yu Chen, Xiaohan Hou, Dongli Yue, Jingwen Zhang, Xiaofeng Zhu, Shuang Wang, Yonghong Cheng
2023 J jnl
CoRR
Danqing Hu, Bing Liu, Xiaofeng Zhu, Xudong Lu, Nan Wu
2022 conf
ISCIT
Xiaofeng Zhu, Xiongfei Li, Xianfeng Gong
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"