Victor Firoiu

25 papers A* 6A 1B 2Journal 10Unranked 6
YearRankTypeTitle / Venue / Authors
2023 conf
HotCarbon
Diptyaroop Maji, Ben Pfaff, Vipin P. R, Rajagopal Sreenivasan, Victor Firoiu, Sreeram Iyer, Colleen Josephson, Zhelong Pan, Ramesh K. Sitaraman
2018 J jnl
RFC
Brian Adamson, Cédric Adjih, Josu Bilbao, Victor Firoiu, Frank H. P. Fitzek, Samah A. M. Ghanem, Emmanuel Lochin, Antonia Masucci, Marie-José Montpetit, Morten Videbæk Pedersen, Goiuri Peralta, Vincent Roca, Paresh Saxena, Senthil Sivakumar
2016 conf
MILCOM
Soumendra Nanda, Charles Tao, Victor Firoiu, Hui Zeng, Gahng-Seop Ahn, Julia Deng
2015 J jnl
IEEE J. Sel. Areas Commun.
Parastoo Sadeghi, João Barros, Victor Firoiu, Frank H. P. Fitzek
2014 B conf
MASS
Benyuan Liu, Victor Firoiu, Jim Kurose, May Leung, Soumendra Nanda
2014 conf
ICN
Mikhail Badov, Anand Seetharam, Jim Kurose, Victor Firoiu, Soumendra Nanda
2014 A conf
MobiSys
Soumendra Nanda, Brian DeCleene, Victor Firoiu, May Leung, Yingbo Song, Charles Tao
2013 conf
MILCOM
Victor Firoiu, Brian DeCleene, May Leung, Soumendra Nanda, Charles Tao
2012 conf
MILCOM
Victor Firoiu, Haiyang Liu
2007 B conf
Networking
Haiyang Liu, Zhi-Li Zhang, Jaideep Srivastava, Victor Firoiu
2006 J jnl
IEEE Trans. Parallel Distributed Syst.
Victor Firoiu, Xiaohui Zhang, Emre Gündüzhan, Nicolas Christin
2004 J jnl
CoRR
Victor Firoiu, Xiaohui Zhang, Emre Gündüzhan, Nicolas Christin
2002 J jnl
RFC
Bruce Davie, Anna Charny, Jon C. R. Bennett, Kent Benson, Jean-Yves Le Boudec, William F. Courtney, Shahram Davari, Victor Firoiu, Dimitrios Stiliadis
2002 conf
Hot Interconnects
Victor Firoiu, Xiaohui Zhang, Emre Gündüzhan
2002 J jnl
RFC
Anna Charny, Jon C. R. Bennett, Kent Benson, Jean-Yves Le Boudec, Angela L. Chiu, William F. Courtney, Shahram Davari, Victor Firoiu, Charles R. Kalmanek, K. K. Ramakrishnan
2002 J jnl
Proc. IEEE
Victor Firoiu, Jean-Yves Le Boudec, Don Towsley, Zhi-Li Zhang
2000 A* conf
INFOCOM
Victor Firoiu, Marty Borden
2000 J jnl
IEEE/ACM Trans. Netw.
Jitendra Padhye, Victor Firoiu, Donald F. Towsley, James F. Kurose
2000 A* conf
SIGMETRICS
Sambit Sahu, Philippe Nain, Christophe Diot, Victor Firoiu, Donald F. Towsley
2000 J jnl
Perform. Evaluation
Sambit Sahu, Victor Firoiu, Donald F. Towsley, James F. Kurose
1999 A* conf
INFOCOM
Victor Firoiu, James F. Kurose, Donald F. Towsley
1998 J jnl
IEEE/ACM Trans. Netw.
Victor Firoiu, James F. Kurose, Donald F. Towsley
1998 A* conf
SIGCOMM
Jitendra Padhye, Victor Firoiu, Donald F. Towsley, James F. Kurose
1997 A* conf
INFOCOM
Victor Firoiu, James F. Kurose, Donald F. Towsley
1996 A* conf
INFOCOM
Victor Firoiu, Donald F. Towsley
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"