James Lott

15 papers A 2B 1Unranked 12
YearRankTypeTitle / Venue / Authors
2013 conf
CSIIRW
Marco M. Carvalho, Thomas C. Eskridge, Larry Bunch, Jeffrey M. Bradshaw, Adam Dalton, Paul J. Feltovich, James Lott, Dan Kidwell
2012 conf
MATES
Larry Bunch, Jeffrey M. Bradshaw, Marco M. Carvalho, Thomas C. Eskridge, Paul J. Feltovich, James Lott, Andrzej Uszok
2012 conf
Web Intelligence/IAT Workshops
Larry Bunch, Jeffrey M. Bradshaw, Thomas C. Eskridge, Paul J. Feltovich, James Lott, Andrzej Uszok, Marco M. Carvalho
2011 conf
MILCOM
Israel Mayk, William C. Regli, Duc N. Nguyen, M. Mai, A. Chan, Todd Urness, B. Goren, S. Kizenko, S. Randles, Z. Jastrebski, J. Ruschmeyer, Lex Lehman, M. McCurdy, David W. Millar, I. Simmons, Christopher T. Cannon, Joseph B. Kopena, A. Patwardhan, G. Tassone, J. Lindquist, G. Jewell, R. Forkenbrock, M. Nicholson, F. Koss, R. Wray, Jeffrey Bradshaw, James Lott
2011 conf
MILCOM
Andrzej Uszok, Jeffrey M. Bradshaw, James Lott, Matthew Johnson, Maggie R. Breedy, Michael Vignati, Keith Whittaker, Kimberly Jakubowski, Jeffrey Bowcock, Daniel Apgar
2009 conf
HCI (10)
Jeffrey M. Bradshaw, Paul J. Feltovich, Matthew Johnson, Maggie R. Breedy, Larry Bunch, Thomas C. Eskridge, Hyuckchul Jung, James Lott, Andrzej Uszok, Jurriaan van Diggelen
2008 conf
CTS
Jeffrey M. Bradshaw, Paul J. Feltovich, Matt Johnson, Larry Bunch, Maggie R. Breedy, Thomas C. Eskridge, Hyuckchul Jung, James Lott, Andrzej Uszok
2008 conf
POLICY
Andrzej Uszok, Jeffrey M. Bradshaw, James Lott, Maggie R. Breedy, Larry Bunch, Paul J. Feltovich, Matthew Johnson, Hyuckchul Jung
2007 conf
AAAI Fall Symposium: Regarding the Intelligence in Distributed Intelligent Systems
Jeffrey M. Bradshaw, Paul J. Feltovich, Matthew Johnson, Larry Bunch, Maggie R. Breedy, Hyuckchul Jung, James Lott, Andrzej Uszok
2005 B conf
CCGRID
Luc Moreau, Jeffrey M. Bradshaw, Maggie R. Breedy, Larry Bunch, Patrick J. Hayes, Matt Johnson, Shriniwas Kulkarni, James Lott, Niranjan Suri, Andrzej Uszok
2005 conf
Knowledge and Information Visualization
Alberto J. Cañas, Roger Carff, Greg Hill, Marco M. Carvalho, Marco Arguedas, Thomas C. Eskridge, James Lott, Rodrigo Carvajal
2003 conf
CEEMAS
Niranjan Suri, Jeffrey M. Bradshaw, Mark H. Burstein, Andrzej Uszok, Brett Benyo, Maggie R. Breedy, Marco M. Carvalho, David J. Diller, Renia Jeffers, Matt Johnson, Shriniwas Kulkarni, James Lott
2003 conf
POLICY
Andrzej Uszok, Jeffrey M. Bradshaw, Renia Jeffers, Niranjan Suri, Patrick J. Hayes, Maggie R. Breedy, Larry Bunch, Matt Johnson, Shriniwas Kulkarni, James Lott
2003 A conf
AAMAS
Jeffrey M. Bradshaw, Andrzej Uszok, Renia Jeffers, Niranjan Suri, Patrick J. Hayes, Mark H. Burstein, Alessandro Acquisti, Brett Benyo, Maggie R. Breedy, Marco M. Carvalho, David J. Diller, Matt Johnson, Shriniwas Kulkarni, James Lott, Maarten Sierhuis, Ron van Hoof
2003 A conf
AAMAS
Niranjan Suri, Jeffrey M. Bradshaw, Andrzej Uszok, Maggie R. Breedy, Marco M. Carvalho, Paul Groth, Renia Jeffers, Matt Johnson, Shriniwas Kulkarni, James Lott, Mark H. Burstein, Brett Benyo, David J. Diller
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"