Chandrashekar Lakshminarayanan

28 papers A* 2A 3B 2Journal 18Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Nataraj Das, Atreya Vedantam, Chandrashekar Lakshminarayanan
2026 J jnl
CoRR
Srividhya Sethuraman, Chandrashekar Lakshminarayanan
2025 J jnl
Syst. Control. Lett.
Lakshmi Mandal, Chandrashekar Lakshminarayanan, Shalabh Bhatnagar
2024 conf
COMAD/CODS (December)
Ishwar Govind, Jerry Thomas, Chandrashekar Lakshminarayanan
2024 J jnl
CoRR
Mahesh Lorik Yadav, Harish Guruprasad Ramaswamy, Chandrashekar Lakshminarayanan
2024 J jnl
CoRR
Riya Mahesh, Rahul Vashisht, Chandrashekar Lakshminarayanan
2023 J jnl
CoRR
Lakshmi Mandal, Chandrashekar Lakshminarayanan, Shalabh Bhatnagar
2023 A conf
AIED
K. M. Shabana, Chandrashekar Lakshminarayanan
2022 conf
AIED (1)
K. M. Shabana, Chandrashekar Lakshminarayanan, Jude K. Anil
2022 J jnl
CoRR
Chandrashekar Lakshminarayanan, Amit Vikram Singh, Arun Rajkumar
2021 J jnl
CoRR
Chandrashekar Lakshminarayanan, Amit Vikram Singh
2020 J jnl
CoRR
Chandrashekar Lakshminarayanan, Amit Vikram Singh
2020 A* conf
NeurIPS
Chandrashekar Lakshminarayanan, Amit Vikram Singh
2020 J jnl
CoRR
Chandrashekar Lakshminarayanan, Amit Vikram Singh
2018 J jnl
IEEE Trans. Autom. Control.
Chandrashekar Lakshminarayanan, Shalabh Bhatnagar, Csaba Szepesvári
2018 A conf
AISTATS
Chandrashekar Lakshminarayanan, Csaba Szepesvári
2017 J jnl
CoRR
Chandrashekar Lakshminarayanan, Shalabh Bhatnagar, Csaba Szepesvári
2017 J jnl
Autom.
Chandrashekar Lakshminarayanan, Shalabh Bhatnagar
2017 J jnl
CoRR
Chandrashekar Lakshminarayanan, Csaba Szepesvári
2017 B conf
CLOUD
Sandeep Kumar, Sindhu Padakandla, Chandrashekar Lakshminarayanan, Priyank Parihar, K. Gopinath, Shalabh Bhatnagar
2016 J jnl
CoRR
Sandeep Kumar, Sindhu Padakandla, Chandrashekar Lakshminarayanan, Priyank Parihar, K. Gopinath, Shalabh Bhatnagar
2016 A conf
ECAI
Raj Kumar Maity, Chandrashekar Lakshminarayanan, Sindhu Padakandla, Shalabh Bhatnagar
2015 A* conf
AAAI
Chandrashekar Lakshminarayanan, Shalabh Bhatnagar
2014 J jnl
CoRR
Chandrashekar Lakshminarayanan, Shalabh Bhatnagar
2014 B conf
HCOMP
Chandrashekar Lakshminarayanan, Ayush Dubey, Shalabh Bhatnagar, Chithralekha Balamurugan
2014 J jnl
CoRR
Chandrashekar Lakshminarayanan, Shalabh Bhatnagar
2014 conf
CDC
Chandrashekar Lakshminarayanan, Shalabh Bhatnagar
2014 J jnl
CoRR
Chandrashekar Lakshminarayanan, Shalabh Bhatnagar
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"