Kara L. Nance

37 papers A 1B 2Misc 2Journal 8Unranked 24
YearRankTypeTitle / Venue / Authors
2018 J jnl
Comput. Secur.
Kim-Kwang Raymond Choo, Matt Bishop, William Bradley Glisson, Kara L. Nance
2017 conf
HICSS
Kara L. Nance, Matt Bishop
2017 conf
HICSS
Matt Bishop, Kara L. Nance, Jason Clark
2017 conf
HICSS
Lucas McDaniel, Kara L. Nance
2016 conf
HICSS
Kara L. Nance, Matt Bishop
2016 conf
HICSS
Matt Bishop, Kara L. Nance, William R. Claycomb
2016 conf
HICSS
Lucas McDaniel, Kara L. Nance
2015 conf
HICSS
Kara L. Nance, Matt Bishop
2014 conf
HICSS
Kara L. Nance, Matt Bishop
2013 conf
HICSS
Lucas McDaniel, Kara L. Nance
2013 conf
HICSS
Kara L. Nance, Matt Bishop, Amelia Phillips
2013 A conf
SIGCSE
Blair Taylor, Matt Bishop, Elizabeth K. Hawthorne, Kara L. Nance
2012 conf
HICSS
Brian Hay, Kara L. Nance, Matt Bishop, Lucas McDaniel
2012 conf
MALWARE
Brian Hay, Kara L. Nance
2011 J jnl
IT Prof.
John Quan, Kara L. Nance, Brian Hay
2011 conf
HICSS
Matt Bishop, Brian Hay, Kara L. Nance
2011 conf
World Conference on Information Security Education
Kara L. Nance, Blair Taylor, Ronald Dodge, Brian Hay
2011 conf
HICSS
Kara L. Nance, Daniel J. Ryan
2011 conf
HICSS
Brian Hay, Kara L. Nance, Matt Bishop
2011 conf
World Conference on Information Security Education
Matt Bishop, Kara L. Nance
2010 conf
SADFE
Amelia Phillips, Kara L. Nance
2010 conf
HICSS
Kara L. Nance, Uma Bhatt, Brian Hay
2009 conf
HICSS
Kara L. Nance, Brian Hay, Matt Bishop
2009 B conf
ARES
Kara L. Nance, Brian Hay, Matt Bishop
2009 J jnl
IEEE Secur. Priv.
Brian Hay, Matt Bishop, Kara L. Nance
2009 conf
HICSS
Kara L. Nance, Brian Hay, Ronald Dodge, James Wrubel, Stephen D. Burd, Alessandro F. Seazzu
2009 B conf
ARES
Ronald C. Dodge, Brian Hay, Kara L. Nance
2009 J jnl
IEEE Secur. Priv.
Kara L. Nance
2008 Misc conf
SEC
Brian Hay, Ronald Dodge, Kara L. Nance
2008 J jnl
IEEE Secur. Priv.
Kara L. Nance, Matt Bishop, Brian Hay
2008 J jnl
J. Digit. Forensic Pract.
Mark Pollitt, Kara L. Nance, Brian Hay, Ronald C. Dodge, Philip Craiger, Paul Burke, Christopher Marberry, Bryan Brubaker
2007 Misc conf
SEC
Kara L. Nance, Brian Hay
2007 conf
HICSS
Kara L. Nance, Brian Hay, Christopher Hecker
2005 J jnl
Comput. Geosci.
Kara L. Nance, Brian Hay
2004 conf
Communications, Internet, and Information Technology
Kara L. Nance, Brian Hay
2000 J jnl
Ars Comb.
Jonathan Wiens, Kara L. Nance
1994 conf
Ethics in Computer Age
Kara L. Nance, Mahla Strohmaier
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"