Xiaokun Yang

47 papers A 1B 2Misc 3Journal 20Unranked 21
YearRankTypeTitle / Venue / Authors
2026 A conf
FPGA
Doru-Thom Popovici, Mario Vega, Angelos Ioannou, Fabien Chaix, Dania Susanne Mosuli, Blair Reasoner, Tan Nguyen, Xiaokun Yang, John Shalf
2026 J jnl
CoRR
Yinghan Hou, Zongyou Yang, Xiaokun Yang
2026 J jnl
CoRR
Yueming Zhang, Shuai Xu, Zhengxiong Li, Fangtian Zhong, Xiaokun Yang, Hailu Xu
2025 conf
ICDM (Workshops)
Keenan Powell, Rubayet Rongon, Xiaokun Yang, Xuechen Zhang
2025 conf
ICDM (Workshops)
Jeremy W. Turner, Cameron D. DiSomma, Xuechen Zhang, Lei Fan, Xiaokun Yang
2025 conf
ICDM (Workshops)
Spencer Miles Buchanan, Jose Ramos, Cameron D. DiSomma, Yunxiang Zhang, Wenfeng Zhao, Xiaokun Yang
2025 J jnl
IEEE Access
Min Peng, Xiaokun Yang, Xiangqing Wang, Dongfei Wang
2025 J jnl
Symmetry
Daoheng Zhu, Xiaokun Yang, Lingbo Han, Jian Yan
2025 J jnl
CoRR
Doru-Thom Popovici, Mario Vega, Angelos Ioannou, Fabien Chaix, Dania Susanne Mosuli, Blair Reasoner, Tan Nguyen, Xiaokun Yang, John Shalf
2024 B conf
IEEE Big Data
Paul Wong, Dania Susanne Mosuli, Xuechen Zhang, Xiaokun Yang
2024 J jnl
Scalable Comput. Pract. Exp.
Chengfei Qi, Xiaobo Yang, Xiaokun Yang, Chaoran Bi, Wenwen Li
2023 conf
UEMCON
Chanakya Hingu, Xingang Fu, Rajab Challoo, Jiang Lu, Xiaokun Yang, Letu Qingge
2023 conf
HPEC
Mario Vega, Xiaokun Yang, John Shalf, Doru-Thom Popovici
2022 J jnl
IEEE Access
Daoheng Zhu, Daian Lu, Xiaokun Yang, Zhiqiang Li
2022 conf
ISQED
April L. Reed, Xiaokun Yang, Shi Sha
2022 conf
ICIC (2)
Caixia Xu, Xiaokun Yang, Zhipeng Wang, Pengyong Han, Xiaoguang Li, Zhengwei Li
2022 J jnl
Int. J. Distributed Syst. Technol.
Ruiming Yuan, Sida Zheng, Yan Liu, Fukuan Pang, Xiaokun Yang
2022 B conf
CLOUD
Guanyu Ding, Zhengxiong Li, Yusen Wu, Xiaokun Yang, Mehrdad Aliasgari, Hailu Xu
2021 J jnl
IEEE Trans. Educ.
Xiaokun Yang
2021 J jnl
J. Circuits Syst. Comput.
Xiaokun Yang, Shi Sha
2021 J jnl
J. Supercomput.
Isaac Westby, Xiaokun Yang, Tao Liu, Hailu Xu
2021 conf
ICBDS
Hongzhang Xiong, Jie Cheng, Yanjin Wang, Xiaokun Yang, Kuo Wang
2021 conf
EITCE
Yinghao Liu, Xiaoman Wang, Xiaokun Yang, Jinwang Li, Chang Liu, Liguo Xu
2020 J jnl
ACM Trans. Design Autom. Electr. Syst.
Shi Sha, Ajinkya S. Bankar, Xiaokun Yang, Wujie Wen, Gang Quan
2020 J jnl
IET Comput. Digit. Tech.
Xiaokun Yang, Shi Sha, Ishaq Unwala, Jiang Lu
2019 conf
ISVLSI
Yunxiang Zhang, Xiaokun Yang, Lei Wu, Jean Andrian
2019 conf
ISQED
Xiaokun Yang, Yunxiang Zhang, Lei Wu
2019 J jnl
J. Commun.
Xiaokun Yang, Lei Wu, Xianlong He, Archit Gajjar, Yi Feng
2019 conf
CSE/EUC
Xiaodi Fu, Jiang Lu, Xin Zhang, Xiaokun Yang, Ishaq Unwala
2019 conf
ISVLSI
Kevin Vaca, Archit Gajjar, Xiaokun Yang
2018 conf
ICACS
Archit Gajjar, Xiaokun Yang, Lei Wu, Hakduran Koc, Ishaq Unwala, Yunxiang Zhang, Yi Feng
2018 conf
ICACS
Yunxiang Zhang, Xiaokun Yang, Lei Wu, Jiang Lu, Kewei Sha, Archit Gajjar, Han He
2018 J jnl
ACM J. Emerg. Technol. Comput. Syst.
Xiaokun Yang, Wujie Wen, Ming Fan
2017 Misc conf
SEC
Archit Gajjar, Yunxiang Zhang, Xiaokun Yang
2017 J jnl
VLSI Design
Xiaokun Yang, Nansong Wu, Jean H. Andrian
2017 conf
DASC/PiCom/DataCom/CyberSciTech
Lucy Nwosu, Hui Wang, Jiang Lu, Ishaq Unwala, Xiaokun Yang, Ting Zhang
2017 conf
AHFE (19)
Xiaokun Yang, Nansong Wu
2017 conf
ASP-DAC
Xiaokun Yang, Wujie Wen
2017 J jnl
CoRR
Han He, Xiaokun Yang, Lei Wu, Hua Yan, Zhimin Gao, Yi Feng, George Townsend
2017 J jnl
J. Syst. Softw.
Ming Fan, Qiushi Han, Xiaokun Yang
2017 Misc conf
SEC
Xiaokun Yang, Xianlong He
2016 J jnl
Integr.
Xiaokun Yang, Nansong Wu, Jean H. Andrian
2016 Misc conf
UbiComp
Baoqi Huang, Guodong Qi, Xiaokun Yang, Long Zhao, Han Zou
2015 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Xiaokun Yang, Jean H. Andrian
2014 conf
ISVLSI
Xiaokun Yang, Jean H. Andrian
2010 conf
VTC Fall
Xinglin Wang, Xiaokun Yang, Zheng Li
2010 conf
VTC Spring
Yushu Zhang, Xinglin Wang, Xiaokun Yang, Xiaojin Zhang
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"