Haibo Lin

30 papers A* 3A 5B 4C 1Journal 9Unranked 8
YearRankTypeTitle / Venue / Authors
2026 J jnl
Autom. Softw. Eng.
Haibo Lin, Zhong Li, Ruihua Ji, Minxue Pan, Tian Zhang, Nan Wu, Xuandong Li
2023 J jnl
Complex.
Xinyu Wang, Liang Zhao, Ning Zhang, Liu Feng, Haibo Lin
2022 J jnl
CoRR
Xinyu Wang, Liang Zhao, Ning Zhang, Liu Feng, Haibo Lin
2022 conf
ICCIR
Haibo Lin, Rongcheng Ding, Yuandong Lu, Di Gao, Xiaolin Sun, Mingyu Yuan, Yu-feng Xiu
2019 A* conf
SOSP
Guoqing Harry Xu, Margus Veanes, Michael Barnett, Madan Musuvathi, Todd Mytkowicz, Ben Zorn, Huan He, Haibo Lin
2018 J jnl
Proc. VLDB Endow.
Zhicheng Yin, Jin Sun, Ming Li, Jaliya Ekanayake, Haibo Lin, Marc T. Friedman, José A. Blakeley, Clemens A. Szyperski, Nikhil R. Devanur
2017 conf
COMPSAC (1)
Yiqi Lu, Jiaqing Liang, Yanghua Xiao, Sheng Huang, Deqing Yang, Wei Wang, Haibo Lin
2016 J jnl
Pattern Recognit.
Haibo Lin, Lei Nie, Zhan Song
2015 conf
ICIA
Haibo Lin, Zhan Song
2015 conf
ICSE (2)
Hucheng Zhou, Jian-Guang Lou, Hongyu Zhang, Haibo Lin, Haoxiang Lin, Tingting Qin
2015 J jnl
J. Robotics
Haibo Lin, Shuliang Dong, Zunmin Liu, Chuijie Yi
2013 A* conf
ICSE
Sihan Li, Hucheng Zhou, Haoxiang Lin, Tian Xiao, Haibo Lin, Wei Lin, Tao Xie
2012 B conf
PPoPP
Olivier Tardieu, Haichuan Wang, Haibo Lin
2012 A* ed.
PLDI
Jan Vitek, Haibo Lin, Frank Tip
2012 J jnl
Int. J. High Perform. Comput. Appl.
Yan Li, Jeffrey R. Diamond, Xu Wang, Haibo Lin, Yudong Yang, Zhenxing Han
2012 J jnl
J. Comput. Sci. Technol.
Chun-Tao Hong, Dehao Chen, Yubei Chen, Wen-Guang Chen, Wei-Min Zheng, Haibo Lin
2011 A conf
IPDPS
Haibo Lin, Tao Liu, Lakshminarayanan Renganarayanan, Huoding Li, Tong Chen, Kevin O'Brien, Ling Shao
2011 conf
Computer-Aided Diagnosis
Najeeb Chowdhury, Jonathan Chappelow, Robert Toth, Sung Kim, Stephen Hahn, Neha Vapiwala, Haibo Lin, Stefan Both, Anant Madabhushi
2010 conf
Euro-Par (1)
Haibo Lin, Chao Li, Qian Wang, Yi Zhao, Ninghe Pan, Xiaotong Zhuang, Ling Shao
2010 B conf
PACT
Haibo Lin, Tao Liu, Huoding Li, Tong Chen, Lakshminarayanan Renganarayanan, Kevin O'Brien, Ling Shao
2010 J jnl
IEEE Netw.
Bo Li, Haibo Lin, Kazem Sohraby, Chonggang Wang
2010 B conf
PACT
Chuntao Hong, Dehao Chen, Wenguang Chen, Weimin Zheng, Haibo Lin
2009 A conf
IPDPS
Yan Li, Li Zhao, Haibo Lin, Alex C. Chow, Jeffrey R. Diamond
2009 A conf
OOPSLA
Yi Zhao, Jin Shi, Kai Zheng, Haichuan Wang, Haibo Lin, Ling Shao
2009 A conf
ICS
Tao Liu, Haibo Lin, Tong Chen, Kevin O'Brien, Ling Shao
2009 B conf
PACT
Qingda Lu, Christophe Alias, Uday Bondhugula, Thomas Henretty, Sriram Krishnamoorthy, J. Ramanujam, Atanas Rountev, P. Sadayappan, Yongjian Chen, Haibo Lin, Tin-Fook Ngai
2009 conf
CCTA
Qing Li, Haibo Lin, Yu-feng Xiu, Ruixue Wang, Chuijie Yi
2008 A conf
ICS
Tong Chen, Haibo Lin, Tao Zhang
2004 C conf
ISPA
Wenlong Li, Haibo Lin, Yu Chen, Zhizhong Tang
2003 conf
APPT
Haibo Lin, Wenlong Li, Zhizhong Tang
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"