James R. Brasic

14 papers Journal 13Unranked 1
YearRankTypeTitle / Venue / Authors
2023 conf
EMBC
Prithvi Prakash, Rachneet Kaur, Joshua Levy, Richard B. Sowers, James R. Brasic, Manuel E. Hernandez
2017 J jnl
NeuroImage
Brian A. Anderson, Hiroto Kuwabara, Dean F. Wong, Joshua Roberts, Arman Rahmim, James R. Brasic, Susan M. Courtney
2015 J jnl
NeuroImage
Lynn M. Oswald, Gary S. Wand, Dean F. Wong, Clayton H. Brown, Hiroto Kuwabara, James R. Brasic
2013 J jnl
NeuroImage
Dean F. Wong, Susanne Ostrowitzki, Yun Zhou, Vanessa Raymont, Carsten Hofmann, Edilio Borroni, Anil Kumar, Nikhat Parkar, James R. Brasic, John Hilton, Robert F. Dannals, Meret Martin-Facklam
2010 J jnl
NeuroImage
Dean F. Wong, Hiroto Kuwabara, Andrew G. Horti, Vanessa Raymont, James R. Brasic, Maria Guevara, Blanca Bisuna, Ayon Nandi, Arman Rahmim, Nicola Cascella
2010 J jnl
NeuroImage
Dean F. Wong, Hiroto Kuwabara, Babar Hussain, Andrew G. Horti, James R. Brasic, Vanessa Raymont, Weiguo Ye, Maria Guevara, Nicola Cascella
2010 J jnl
NeuroImage
Lynn Oswald, Gary Wand, Yun Zhou, Anil Kumar, James R. Brasic, Weiguo Ye, Hiroto Kuwabara, R. B. Bausell, Albert Gjedde, Dean F. Wong
2010 J jnl
NeuroImage
Yun Zhou, Weiguo Ye, James R. Brasic, Dean F. Wong
2010 J jnl
NeuroImage
Hiroto Kuwabara, Jongho Kim, Blanca Bisuna, James R. Brasic, Elise Weerts, Mary McCaul, Gary Wand, Dean F. Wong
2010 J jnl
NeuroImage
Dean F. Wong, Hiroto Kuwabara, Andrew G. Horti, Vanessa Raymont, James R. Brasic, Maria Guevara, Weiguo Ye, Robert F. Dannals, Hayden T. Ravert, Ayon Nandi, Arman Rahmim, Jeffrey E. Ming, Igor Grachev, Christine Roy, Nicola Cascella
2009 J jnl
NeuroImage
Yun Zhou, Weiguo Ye, James R. Brasic, Andrew H. Crabb, John Hilton, Dean F. Wong
2007 J jnl
NeuroImage
Lynn M. Oswald, Dean F. Wong, Yun Zhou, Anil Kumar, James R. Brasic, Mohab Alexander, Weiguo Ye, Hiroto Kuwabara, John Hilton, Gary S. Wand
2006 J jnl
NeuroImage
Yun Zhou, Ming-Kai Chen, Christopher J. Endres, Weiguo Ye, James R. Brasic, Mohab Alexander, Andrew H. Crabb, Tomás R. Guilarte, Dean F. Wong
2003 J jnl
NeuroImage
Yun Zhou, Christopher J. Endres, James R. Brasic, Sung-Cheng Huang, Dean F. Wong
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"