Haiping Wu

38 papers A* 7A 5B 2C 1Misc 1Journal 13Unranked 9
YearRankTypeTitle / Venue / Authors
2025 A* conf
CVPR
Jiuhai Chen, Jianwei Yang, Haiping Wu, Dianqi Li, Jianfeng Gao, Tianyi Zhou, Bin Xiao
2024 A* conf
CVPR
Bin Xiao, Haiping Wu, Weijian Xu, Xiyang Dai, Houdong Hu, Yumao Lu, Michael Zeng, Ce Liu, Lu Yuan
2024 J jnl
CoRR
Jiuhai Chen, Jianwei Yang, Haiping Wu, Dianqi Li, Jianfeng Gao, Tianyi Zhou, Bin Xiao
2023 J jnl
CoRR
Bin Xiao, Haiping Wu, Weijian Xu, Xiyang Dai, Houdong Hu, Yumao Lu, Michael Zeng, Ce Liu, Lu Yuan
2022 J jnl
Int. J. Comput. Vis.
Zhaoxiang Zhang, Chuanchen Luo, Haiping Wu, Yuntao Chen, Naiyan Wang, Chunfeng Song
2021 A* conf
ICCV
Haiping Wu, Xiaolong Wang
2021 J jnl
CoRR
Haiping Wu, Xiaolong Wang
2021 A* conf
ICCV
Haiping Wu, Bin Xiao, Noel Codella, Mengchen Liu, Xiyang Dai, Lu Yuan, Lei Zhang
2021 J jnl
CoRR
Haiping Wu, Bin Xiao, Noel Codella, Mengchen Liu, Xiyang Dai, Lu Yuan, Lei Zhang
2021 A* conf
AAAI
Haiping Wu, Khimya Khetarpal, Doina Precup
2020 A* conf
AAAI
Haiping Wu, Bin Xiao
2020 J jnl
Adv. Eng. Informatics
Hui Liu, Chengming Yu, Chengqing Yu, Chao Chen, Haiping Wu
2019 conf
CSI@MICCAI
Rong Tao, Shangliang Xu, Haiping Wu, Cheng Zhang, Chuanfeng Lv
2019 conf
ICAC
Xinwei Lv, Zhiren Ren, Bo Tang, Hui Liu, Rui Yang, Haiping Wu
2019 conf
ICAC
Zhiren Ren, Bo Tang, Longfeng Wang, Hui Liu, Yanfei Li, Haiping Wu
2019 A* conf
ICCV
Haiping Wu, Yuntao Chen, Naiyan Wang, Zhaoxiang Zhang
2019 J jnl
CoRR
Haiping Wu, Yuntao Chen, Naiyan Wang, Zhaoxiang Zhang
2018 J jnl
Multim. Tools Appl.
Xing Xu, Haiping Wu, Yang Yang, Fumin Shen, Ning Xie, Yanli Ji
2018 conf
ECCV (6)
Bin Xiao, Haiping Wu, Yichen Wei
2018 J jnl
CoRR
Bin Xiao, Haiping Wu, Yichen Wei
2017 C conf
IECON
Yalei Sang, Xuemei Wang, Xun Yuan, Bo Zhang, Haiping Wu, Jiajian Li
2017 conf
ICIMCS
Haiping Wu, Yang Yang, Xing Xu, Fumin Shen, Ning Xie, Yanli Ji
2015 J jnl
Ars Comb.
Qing Liu, Zhishan Liu, Haiping Wu
2015 J jnl
Future Gener. Comput. Syst.
Yan Ma, Haiping Wu, Lizhe Wang, Bormin Huang, Rajiv Ranjan, Albert Y. Zomaya, Wei Jie
2010 conf
FSKD
Guangyue Xu, Weimin Zheng, Haiping Wu, Yujiu Yang
2009 conf
SKG
Shiqiang Zhen, Yujiu Yang, Haiping Wu, Wenhuang Liu
2007 A conf
IPDPS
Haiping Wu, Eunjung Park, Mihailo Kaplarevic, Yingping Zhang, Murat Bolat, Xiaoming Li, Guang R. Gao
2007 J jnl
Int. J. Wirel. Inf. Networks
Haiping Wu, Mohsen Kavehrad
2006 Misc conf
International Conference on Computational Science (3)
Haiping Wu, Hongliang Yu, Bigang Li, Wei Xue, Weimin Zheng
2006 conf
Software Engineering Research and Practice
Haiping Wu, Long Chen, Joseph B. Manzano, Guang R. Gao
2006 A conf
IPDPS
Yingping Zhang, Taikyeong Jeong, Fei Chen, Haiping Wu, Ronny Nitzsche, Guang R. Gao
2006 conf
Software Engineering Research and Practice
Haiping Wu, Eunjung Park, Long Chen, Juan del Cuvillo, Guang R. Gao
2005 B conf
GLOBECOM
Haiping Wu, Mohsen Kavehrad
2005 A conf
ESA
Haiping Wu, Ziang Hu, Joseph B. Manzano, Yingping Zhang, Guang R. Gao
2005 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Haiping Wu, Ziang Hu, Joseph B. Manzano, Guang R. Gao
2004 B conf
PIMRC
Haiping Wu, Sangwoo Lee, Mohsen Kavehrad
2003 A conf
IPDPS
Guang R. Gao, Kevin B. Theobald, Ramaswamy Govindarajan, Clement Leung, Ziang Hu, Haiping Wu, Jizhu Lu, Juan del Cuvillo, Adeline Jacquet, Vincent Janot, Thomas L. Sterling
2002 A conf
IPDPS
Guang R. Gao, Kevin B. Theobald, Ziang Hu, Haiping Wu, Jizhu Lu, Keshav Pingali, Paul Stodghill, Thomas L. Sterling, Rick Stevens, Mark Hereld
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"