Kamran Shafi

54 papers A 2B 8Journal 23Unranked 20
YearRankTypeTitle / Venue / Authors
2020 J jnl
Inf. Process. Manag.
Khawar Mehmood, Daryl Essam, Kamran Shafi, Muhammad Kamran Malik
2020 J jnl
ACM Trans. Asian Low Resour. Lang. Inf. Process.
Khawar Mehmood, Daryl Essam, Kamran Shafi, Muhammad Kamran Malik
2019 J jnl
Syst.
Hassan Abdelbari, Kamran Shafi
2019 J jnl
IEEE Access
Khawar Mehmood, Daryl Essam, Kamran Shafi, Muhammad Kamran Malik
2019 J jnl
Pattern Anal. Appl.
Essam Soliman Debie, Kamran Shafi
2018 conf
SSCI
Min Wang, Aya Hussein, Raul Fernandez Rojas, Kamran Shafi, Hussein A. Abbass
2018 J jnl
J. Artif. Intell. Soft Comput. Res.
Hassan Abdelbari, Kamran Shafi
2018 conf
ICCMS
Hassan Abdelbari, Kamran Shafi
2018 conf
ASAR
Asghar Ali, Mark Pickering, Kamran Shafi
2017 conf
ICCMS
Hassan Abdelbari, Kamran Shafi
2017 J jnl
IEEE Comput. Intell. Mag.
Kamran Shafi, Hussein A. Abbass
2017 conf
ICACI
Kamran Shafi
2017 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Shir Li Wang, Kamran Shafi, Theam Foo Ng, Chris Lokan, Hussein A. Abbass
2017 J jnl
Int. J. Comput. Intell. Appl.
Bin Zhang, Kamran Shafi, Hussein A. Abbass
2017 J jnl
Comput. Intell.
Essam Soliman Debie, Kamran Shafi, Kathryn E. Merrick, Chris Lokan
2017 J jnl
Appl. Soft Comput.
Kamran Shafi, Saber M. Elsayed, Ruhul A. Sarker, Michael J. Ryan
2016 J jnl
Future Internet
Kathryn E. Merrick, Medria K. D. Hardhienata, Kamran Shafi, Jiankun Hu
2016 B conf
CEC
Bin Zhang, Kamran Shafi, Hussein A. Abbass
2016 conf
GECCO (Companion)
Karthik Kuber, Masaya Nakata, Kamran Shafi
2016 J jnl
CoRR
Julien Gout, Markus Quade, Kamran Shafi, Robert K. Niven, Markus Abel
2016 B conf
IJCNN
Hassan Abdelbari, Kamran Shafi
2016 conf
ACALCI
Ayman Ghoneim, Kamran Shafi
2016 conf
SSCI
Kathryn E. Merrick, Medria K. D. Hardhienata, Kamran Shafi, Jiankun Hu
2015 J jnl
Evol. Intell.
Tim Kovacs, Muhammad Iqbal, Kamran Shafi, Ryan J. Urbanowicz
2014 B conf
IEEE Congress on Evolutionary Computation
Essam Soliman Debie, Kamran Shafi, Kathryn E. Merrick, Chris Lokan
2014 conf
SEAL
Kamran Shafi, Hussein A. Abbass
2014 B conf
IEEE Congress on Evolutionary Computation
Bin Zhang, Kamran Shafi, Hussein A. Abbass
2013 J jnl
Adapt. Behav.
Shir Li Wang, Kamran Shafi, Chris Lokan, Hussein A. Abbass
2013 J jnl
Pattern Anal. Appl.
Kamran Shafi, Hussein A. Abbass
2013 conf
MilCIS
Benn Cowen, Kamran Shafi
2013 conf
SDE
Essam Soliman Debie, Kamran Shafi, Chris Lokan, Kathryn E. Merrick
2013 J jnl
Evol. Intell.
Essam Soliman Debie, Kamran Shafi, Chris Lokan, Kathryn E. Merrick
2013 conf
GECCO (Companion)
Essam Soliman Debie, Kamran Shafi, Chris Lokan
2013 conf
CIEL
Essam Soliman Debie, Kamran Shafi, Chris Lokan, Kathryn E. Merrick
2013 J jnl
Evol. Intell.
Kamran Shafi, Ryan J. Urbanowicz, Muhammad Iqbal
2012 conf
SEAL
Bin Zhang, Kamran Shafi, Hussein A. Abbass
2012 conf
SEAL
Kamran Shafi, Kathryn E. Merrick, Essam Soliman Debie
2012 conf
SEAL
Kamran Shafi, Axel Bender, Hussein A. Abbass
2012 B conf
IEEE Congress on Evolutionary Computation
Jian Xiong, Kamran Shafi, Hussein A. Abbass
2012 conf
RiTA
Shir Li Wang, Kamran Shafi, Chris Lokan, Hussein A. Abbass
2012 conf
RiTA
Bin Zhang, Kamran Shafi, Hussein A. Abbass
2011 A conf
AAMAS
Kamran Shafi, Kathryn E. Merrick
2011 J jnl
Adapt. Behav.
Kathryn E. Merrick, Kamran Shafi
2011 A conf
GECCO
Kamran Shafi, Axel Bender, Hussein A. Abbass
2010 J jnl
Evol. Syst.
Shir Li Wang, Kamran Shafi, Chris Lokan, Hussein A. Abbass
2010 B conf
IEEE Congress on Evolutionary Computation
Kamran Shafi, Axel Bender, Hussein A. Abbass
2010 B conf
FUZZ-IEEE
Shir Li Wang, Kamran Shafi, Chris Lokan, Hussein A. Abbass
2009 J jnl
Expert Syst. Appl.
Kamran Shafi, Hussein A. Abbass
2009 J jnl
Nat. Comput.
Kamran Shafi, Tim Kovacs, Hussein A. Abbass, Weiping Zhu
2008
Kamran Shafi
2007 J jnl
Inf. Secur. Tech. Rep.
Kamran Shafi, Hussein A. Abbass
2007 B conf
IEEE Congress on Evolutionary Computation
Kamran Shafi, Hussein A. Abbass, Weiping Zhu
2006 conf
SEAL
Kamran Shafi, Hussein A. Abbass, Weiping Zhu
2005 conf
Australian Conference on Artificial Intelligence
Hai Huong Dam, Kamran Shafi, Hussein A. Abbass
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"