Rajeev Tiwari

41 papers Journal 36Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Netw. Serv. Manag.
Surendra Kumar, Jitendra Kumar Samriya, Rajeev Tiwari, Mohit Kumar, Shilpi Harnal, Neeraj Kumar, Mohsen Guizani
2025 J jnl
IEEE Trans. Consumer Electron.
Prakhar Consul, Rajeev Tiwari, Surbhi Bhatia Khan, Eid Albalawi, Fatima A. Asiri, Ahlam Almusharraf
2025 J jnl
IEEE Access
Rajeev Tiwari, Sumit Kumar, Shashank Sheshar Singh, Harish Kumar Shakya
2025 J jnl
Pervasive Mob. Comput.
Sumit Kumar, Rajeev Tiwari
2024 J jnl
Biomed. Signal Process. Control.
Amar Shukla, Rajeev Tiwari, Shamik Tiwari
2024 J jnl
Peer Peer Netw. Appl.
Gaurav Goel, Rajeev Tiwari
2024 J jnl
Neural Comput. Appl.
Rajeev Tiwari, Gourav Bathla, Shuchi Upadhyay
2024 J jnl
Mob. Networks Appl.
Deep Chandra Binwal, Rajeev Tiwari, Monit Kapoor
2024 J jnl
Int. J. Imaging Syst. Technol.
Amar Shukla, Rajeev Tiwari, Shamik Tiwari
2023 J jnl
J. Netw. Syst. Manag.
Deep Chandra Binwal, Rajeev Tiwari, Monit Kapoor
2023 J jnl
SN Comput. Sci.
Amar Shukla, Rajeev Tiwari, Shamik Tiwari
2023 J jnl
Mach. Learn. Knowl. Extr.
Amar Shukla, Rajeev Tiwari, Shamik Tiwari
2023 J jnl
Pervasive Mob. Comput.
Sumit Kumar, Rajeev Tiwari
2023 J jnl
Comput. Syst. Sci. Eng.
Vinay Gautam, Naresh Kumar Trivedi, Abhineet Anand, Rajeev Tiwari, Atef Zaguia, Deepika Koundal, Sachin Jain
2023 J jnl
J. Ambient Intell. Humaniz. Comput.
Jitendra Kumar Samriya, Mohit Kumar, Rajeev Tiwari
2023 J jnl
Neural Comput. Appl.
Usha Mittal, Priyanka Chawla, Rajeev Tiwari
2023 J jnl
Wirel. Pers. Commun.
Jitendra Kumar Samriya, Rajeev Tiwari, Mohammad S. Obaidat, Gourav Bathla
2023 J jnl
Expert Syst. Appl.
Kanchan Sitaram Pradhan, Priyanka Chawla, Rajeev Tiwari
2023 J jnl
J. Ambient Intell. Humaniz. Comput.
Sumit Kumar, Rajeev Tiwari
2023 conf
ICCCNT
Sumit Kumar, Rajeev Tiwari, Pardeep Singh
2023 J jnl
Wirel. Pers. Commun.
Gaurav Goel, Rajeev Tiwari
2023 conf
ISED
Rajat Garg, Kartikay Singh, Isha Singh, Anil Kumar, Shashi Kumar, Rajeev Tiwari
2022 J jnl
Expert Syst. J. Knowl. Eng.
Mamillapally Nagaraju, Priyanka Chawla, Shuchi Upadhyay, Rajeev Tiwari
2022 J jnl
IEEE Access
Parag Verma, Rajeev Tiwari, Wei-Chiang Hong, Shuchi Upadhyay, Yi-Hsuan Yeh
2022 J jnl
Neural Comput. Appl.
Gourav Bathla, Pardeep Singh, Rahul Kumar Singh, Erik Cambria, Rajeev Tiwari
2022 J jnl
Clust. Comput.
Sumit Kumar, Rajeev Tiwari, Sergei A. Kozlov, Joel J. P. C. Rodrigues
2022 J jnl
Sustain. Comput. Informatics Syst.
Jitendra Kumar Samriya, Rajeev Tiwari, Xiaochun Cheng, Rahul Kumar Singh, Achyut Shankar, Manoj Kumar
2022 J jnl
Sensors
Prabhjot Kaur, Shilpi Harnal, Rajeev Tiwari, Shuchi Upadhyay, Surbhi Bhatia, Arwa A. Mashat, Aliaa M. Alabdali
2022 J jnl
Int. J. Softw. Sci. Comput. Intell.
Gaurav Goel, Rajeev Tiwari
2022 J jnl
Int. J. Intell. Inf. Technol.
Himanshu Sahu, Rajeev Tiwari, Sumit Kumar
2021 J jnl
Wirel. Pers. Commun.
Premkumar Chithaluru, Rajeev Tiwari, Kamal Kumar
2021 J jnl
Clust. Comput.
Sumit Kumar, Rajeev Tiwari
2021 J jnl
Sensors
Sumit Kumar, Rajeev Tiwari, Wei-Chiang Hong
2020 conf
ICC
Sumit Kumar, Rajeev Tiwari, Mohammad S. Obaidat, Neeraj Kumar, Kuei-Fang Hsiao
2020 J jnl
Comput. Networks
Sumit Kumar, Rajeev Tiwari
2019 J jnl
Comput. Networks
Premkumar Chithaluru, Rajeev Tiwari, Kamal Kumar
2016 J jnl
Telecommun. Syst.
Rajeev Tiwari, Neeraj Kumar
2015 J jnl
Wirel. Pers. Commun.
Rajeev Tiwari, Neeraj Kumar
2013 J jnl
ACM SIGSOFT Softw. Eng. Notes
Rajeev Tiwari, Noopur Goel
2012 conf
IMIS
Rajeev Tiwari, Neeraj Kumar
2010 conf
CNSA
Rajeev Tiwari, Gulista Khan
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"