Rajesh Kalyanam

25 papers A* 2B 1C 1Misc 2Journal 7Unranked 11
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Sorin Adam Matei, Rajesh Kalyanam
2025 A* conf
CVPR
Aocheng Li, James Zimmer-Dauphinee, Rajesh Kalyanam, Ian Lindsay, Parker VanValkenburgh, Steven A. Wernke, Daniel G. Aliaga
2025 J jnl
CoRR
Aocheng Li, James Zimmer-Dauphinee, Rajesh Kalyanam, Ian Lindsay, Parker VanValkenburgh, Steven A. Wernke, Daniel G. Aliaga
2023 J jnl
Comput. Sci. Eng.
Sandra Gesing, Claire Stirm, Gerhard Klimeck, Lynn K. Zentner, Su Wang, Braulio Misael Villegas-Martínez, Hector M. Moya-Cessa, Carrie Diaz Eaton, Samuel S. Donovan, Carol X. Song, Lan Zhao, I Luk Kim, Alejandro Strachan, Michael G. Zentner, Rajesh Kalyanam
2022 conf
PEARC
Carol X. Song, Preston M. Smith, Rajesh Kalyanam, Xiao Zhu, Eric Adams, Kevin D. Colby, Patrick Finnegan, Erik Gough, Elizabett Hillery, Rick Irvine, Amiya K. Maji, Jason St. John
2022 B conf
e-Science
Nicole Brewer, Robert Campbell, Rajesh Kalyanam, I Luk Kim, Carol X. Song, Lan Zhao
2022 conf
HICSS
Sandra Gesing, Claire Stirm, Gerhard Klimeck, Lynn K. Zentner, Su Wang, Braulio Misael Villegas-Martínez, Carrie Diaz Eaton, Samuel S. Donovan, Lan Zhao, Carol X. Song, I Luk Kim, Alejandro Strachan, Michael G. Zentner, Rajesh Kalyanam
2021 J jnl
Concurr. Comput. Pract. Exp.
Rajesh Kalyanam, Vlado Stankovski
2021 conf
PEARC
Mike Lambert, Rajesh Kalyanam, Rob Kooper, Baijian Yang
2020 C conf
FIE
Rajesh Kalyanam, Baijian Yang, Craig Willis, Mike Lambert, Christine R. Kirkpatrick
2020 conf
PEARC
Manush Bhatt, Rajesh Kalyanam, Gen Nishida, Liu He, Christopher May, Dev Niyogi, Daniel G. Aliaga
2020 J jnl
CoRR
Manush Bhatt, Rajesh Kalyanam, Gen Nishida, Liu He, Christopher May, Dev Niyogi, Daniel G. Aliaga
2020 conf
PEARC
Rajesh Kalyanam, Lan Zhao, Carol X. Song, Venkatesh M. Merwade, Jian Jin, Uris Lantz C. Baldos, Jack A. Smith
2019 Misc conf
SIGITE
Baijian Yang, Rajesh Kalyanam, Craig Willis, Mike Lambert, Christine R. Kirkpatrick
2019 J jnl
Future Gener. Comput. Syst.
Rajesh Kalyanam, Lan Zhao, Carol X. Song, Larry L. Biehl, Derrick Kearney, I Luk Kim, Jaewoo Shin, Nelson B. Villoria, Venkatesh M. Merwade
2018 conf
PEARC
Larry L. Biehl, Lan Zhao, Carolyn Ellis, Rajesh Kalyanam, Robert Campbell, Carol X. Song
2018 conf
PEARC
Sorin Adam Matei, Rajesh Kalyanam, Lan Zhao, Carol X. Song
2017 conf
PEARC
Rajesh Kalyanam, Robert Campbell, Derrick Kearney, Leif Delgass, Larry L. Biehl, Lan Zhao, Carolyn Ellis, Carol X. Song
2017 conf
IWSG
Lan Zhao, Carol X. Song, Rajesh Kalyanam, Larry L. Biehl, Robert Campbell, Leif Delgass, Derrick Kearney, Wei Wan, Jaewoo Shin, I Luk Kim, Carolyn Ellis
2017 Misc conf
SIGITE
Rajesh Kalyanam, Baijian Yang
2016
Rajesh Kalyanam
2013 conf
XSEDE
Rajesh Kalyanam, Lan Zhao, Carol X. Song, Yuet Ling Wong, Jaewoo Lee, Nelson B. Villoria
2011 J jnl
J. Artif. Intell. Res.
Jia-Hong Wu, Rajesh Kalyanam, Robert Givan
2008 A* conf
ICAPS
Jia-Hong Wu, Rajesh Kalyanam, Robert Givan
2007 conf
FTDCS
Rajesh Kalyanam, Lan Zhao, Taezoon Park, Sebastien Goasguen
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"