Victor Bahl

29 papers A* 6A 3B 2C 2Misc 5Journal 8Unranked 1
YearRankTypeTitle / Venue / Authors
2024 Misc conf
NSDI
Yiwen Zhang, Xumiao Zhang, Ganesh Ananthanarayanan, Anand P. Iyer, Yuanchao Shu, Victor Bahl, Z. Morley Mao, Mosharaf Chowdhury
2023 Misc conf
NSDI
Mehrdad Khani Shirkoohi, Ganesh Ananthanarayanan, Kevin Hsieh, Junchen Jiang, Ravi Netravali, Yuanchao Shu, Mohammad Alizadeh, Victor Bahl
2022 A* conf
KDD
Jian Zhang, Jian Tang, Yiran Chen, Jie Liu, Jieping Ye, Marilyn Wolf, Vijaykrishnan Narayanan, Mani B. Srivastava, Michael I. Jordan, Victor Bahl
2021 A* conf
KDD
Jian Zhang, Jian Tang, Yiran Chen, Jie Liu, Jieping Ye, Marilyn Wolf, Vijaykrishnan Narayanan, Mani Srivastava, Michael I. Jordan, Victor Bahl
2020 J jnl
CoRR
Sandeep D'Souza, Victor Bahl, Lixiang Ao, Landon P. Cox
2020 J jnl
CoRR
Romil Bhardwaj, Zhengxu Xia, Ganesh Ananthanarayanan, Junchen Jiang, Nikolaos Karianakis, Yuanchao Shu, Kevin Hsieh, Victor Bahl, Ion Stoica
2019 A conf
MobiSys
Ganesh Ananthanarayanan, Victor Bahl, Landon P. Cox, Alex Crown, Shadi A. Noghabi, Yuanchao Shu
2018 J jnl
IEEE Trans. Serv. Comput.
Victor Bahl, Barbara Carminati, James Caverlee, Ing-Ray Chen, Wynne Hsu, Toru Ishida, Valérie Issarny, Surya Nepal, Indrakshi Ray, Kui Ren, Shamik Sural, Mei-Ling Shyu
2017 J jnl
CoRR
Bharathan Balaji, Bradford Campbell, Amit Levy, Xiaozhou Li, Addison Mayberry, Nirupam Roy, Vasuki Narasimha Swamy, Longqi Yang, Victor Bahl, Ranveer Chandra, Ratul Mahajan
2015 A conf
DATE
Swagath Venkataramani, Victor Bahl, Xian-Sheng Hua, Jie Liu, Jin Li, Matthai Philipose, Bodhi Priyantha, Mohammed Shoaib
2014 A* conf
MobiCom
Victor Bahl, Leonard Kleinrock, Randy H. Katz, Imrich Chlamtac
2014 Misc conf
COMSNETS
Hon Lung Chu, Vijay Raman, Jeffrey Shen, Aman Kansal, Victor Bahl, Romit Roy Choudhury
2011 A conf
MobiSys
Hon Lung Chu, Vijay Raman, Jeffrey Shen, Romit Roy Choudhury, Aman Kansal, Victor Bahl
2010 Misc conf
HotNets
Sharad Agarwal, Ratul Mahajan, Alice Zheng, Victor Bahl
2010 Misc conf
HotNets
Colin Dixon, Ratul Mahajan, Sharad Agarwal, A. J. Bernheim Brush, Bongshin Lee, Stefan Saroiu, Victor Bahl
2010 conf
HealthSec
Alec Wolman, Stefan Saroiu, Victor Bahl
2009 B conf
MobiHoc
Zhou Wang, Ranveer Chandra, Thomas Moscibroda, Alain Gefflaut, Alexandre de Baynast, Victor Bahl
2008 A* ed.
SIGCOMM
Victor Bahl, David Wetherall, Stefan Savage, Ion Stoica
2006 ed.
COMSWARE
Victor Bahl, Bijendra Nath Jain, Henning Schulzrinne, Alfred Z. Spector
2006 ed.
Vehicular Ad Hoc Networks
Wieland Holfelder, David B. Johnson, Hannes Hartenstein, Victor Bahl
2005 B conf
MobiHoc
Sascha D. Meinrath, Victor Bahl, Kenneth R. Carter, Mark Cooper, Ben Scott, Matt Westervelt
2005 C conf
BROADNETS
Pradeep Kyasanur, Jitendra Padhye, Victor Bahl
2004 A* conf
INFOCOM
Ranveer Chandra, Victor Bahl, Pradeep Bahl
2001 C ed.
WOWMOM
Victor Bahl, Adam Wolisz
2000 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
Victor Bahl
2000 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
Victor Bahl
1999 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
Victor Bahl
1999 A* ed.
MobiCom
Harel Kodesh, Victor Bahl, Tomasz Imielinski, Martha Steenstrup
1999 J jnl
ACM SIGMOBILE Mob. Comput. Commun. Rev.
Victor Bahl
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"