Oliver Giudice

56 papers B 9Journal 28Unranked 19
YearRankTypeTitle / Venue / Authors
2025 J jnl
Multim. Tools Appl.
Lorenzo Catania, Oliver Giudice, Sebastiano Battiato, Filippo Stanco, Dario Allegra
2025 conf
COLING Workshops
Claudia Biancotti, Carolina Camassa, Andrea Coletta, Oliver Giudice, Aldo Glielmo
2025 B conf
IJCNN
Golnoosh Babaei, Oliver Giudice, Paolo Giudici, Alessandro Maggi
2024 J jnl
CoRR
Claudia Biancotti, Carolina Camassa, Andrea Coletta, Oliver Giudice, Aldo Glielmo
2024 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Luca Guarnera, Oliver Giudice, Sebastiano Battiato
2023 conf
MetroXRAINE
Nicolò Fabio Arceri, Oliver Giudice, Sebastiano Battiato
2023 J jnl
CoRR
Nicolò Fabio Arceri, Oliver Giudice, Sebastiano Battiato
2023 J jnl
Multim. Tools Appl.
Luca Guarnera, Oliver Giudice, Salvatore Livatino, Antonino Barbaro Paratore, Angelo Salici, Sebastiano Battiato
2023 conf
ICASSP Workshops
Alessia Rondinella, Francesco Guarnera, Oliver Giudice, Alessandro Ortis, Francesco Rundo, Sebastiano Battiato
2023 J jnl
Comput. Biol. Medicine
Alessia Rondinella, Elena Crispino, Francesco Guarnera, Oliver Giudice, Alessandro Ortis, Giulia Russo, Clara Di Lorenzo, Davide Maimone, Francesco Pappalardo, Sebastiano Battiato
2023 conf
MetroXRAINE
Valerio Francesco Puglisi, Oliver Giudice, Sebastiano Battiato
2023 J jnl
CoRR
Valerio Francesco Puglisi, Oliver Giudice, Sebastiano Battiato
2023 conf
ICIAP (2)
Francesco Guarnera, Alessia Rondinella, Oliver Giudice, Alessandro Ortis, Sebastiano Battiato, Francesco Rundo, Giorgio Fallica, Francesco Traina, Sabrina Conoci
2023 conf
BIBM
Alessia Rondinella, Francesco Guarnera, Oliver Giudice, Alessandro Ortis, Giulia Russo, Elena Crispino, Francesco Pappalardo, Sebastiano Battiato
2023 conf
NLPIR
Oliver Giudice, Alessandro Maggi, Matteo Nardelli
2023 J jnl
CoRR
Luca Guarnera, Oliver Giudice, Sebastiano Battiato
2023 conf
ICIAP (1)
Roberto Leotta, Oliver Giudice, Luca Guarnera, Sebastiano Battiato
2023 J jnl
CoRR
Roberto Leotta, Oliver Giudice, Luca Guarnera, Sebastiano Battiato
2022 J jnl
J. Vis. Commun. Image Represent.
Sebastiano Battiato, Oliver Giudice, Francesco Guarnera, Giovanni Puglisi
2022 conf
ICIAP (2)
Luca Guarnera, Oliver Giudice, Sebastiano Battiato
2022 J jnl
CoRR
Luca Guarnera, Oliver Giudice, Sebastiano Battiato
2022 conf
ICIAP (1)
Lorenzo Catania, Dario Allegra, Oliver Giudice, Filippo Stanco, Sebastiano Battiato
2022 conf
CVPR Workshops
Stefano Borzì, Oliver Giudice, Filippo Stanco, Dario Allegra
2022 B conf
ICPR
Maria Ausilia Napoli Spatafora, Dario Allegra, Oliver Giudice, Filippo Stanco, Sebastiano Battiato
2022 conf
CVPR Workshops
Luca Guarnera, Oliver Giudice, Matthias Nießner, Sebastiano Battiato
2022 J jnl
CoRR
Luca Guarnera, Oliver Giudice, Matthias Nießner, Sebastiano Battiato
2022 J jnl
J. Imaging
Luca Guarnera, Oliver Giudice, Francesco Guarnera, Alessandro Ortis, Giovanni Puglisi, Antonino Barbaro Paratore, Linh M. Q. Bui, Marco Fontani, Davide Alessandro Coccomini, Roberto Caldelli, Fabrizio Falchi, Claudio Gennaro, Nicola Messina, Giuseppe Amato, Gianpaolo Perelli, Sara Concas, Carlo Cuccu, Giulia Orrù, Gian Luca Marcialis, Sebastiano Battiato
2021 J jnl
J. Imaging
Francesco Guarnera, Oliver Giudice, Dario Allegra, Filippo Stanco, Sebastiano Battiato, Salvatore Livatino, Vito Matranga, Angelo Salici
2021 J jnl
EURASIP J. Inf. Secur.
Sebastiano Battiato, Oliver Giudice, Francesco Guarnera, Giovanni Puglisi
2021 J jnl
J. Imaging
Oliver Giudice, Luca Guarnera, Sebastiano Battiato
2021 J jnl
CoRR
Oliver Giudice, Luca Guarnera, Sebastiano Battiato
2021 J jnl
IEEE Access
Sebastiano Battiato, Oliver Giudice, Francesco Guarnera, Giovanni Puglisi
2021 conf
IMPROVE
Sebastiano Battiato, Pasquale Caponnetto, Oliver Giudice, Mazhar Hussain, Roberto Leotta, Alessandro Ortis, Riccardo Polosa
2020 J jnl
CoRR
Oliver Giudice, Dario Allegra, Francesco Guarnera, Filippo Stanco, Sebastiano Battiato
2020 B conf
ICIP
Oliver Giudice, Dario Allegra, Francesco Guarnera, Filippo Stanco, Sebastiano Battiato
2020 B conf
ICPR
Sebastiano Battiato, Oliver Giudice, Francesco Guarnera, Giovanni Puglisi
2020 conf
CVPR Workshops
Luca Guarnera, Oliver Giudice, Sebastiano Battiato
2020 J jnl
CoRR
Luca Guarnera, Oliver Giudice, Sebastiano Battiato
2020 J jnl
IEEE Access
Luca Guarnera, Oliver Giudice, Sebastiano Battiato
2020 J jnl
CoRR
Luca Guarnera, Oliver Giudice, Sebastiano Battiato
2020 conf
ICPR Workshops (6)
Sebastiano Battiato, Oliver Giudice, Francesco Guarnera, Giovanni Puglisi
2020 J jnl
CoRR
Sebastiano Battiato, Oliver Giudice, Francesco Guarnera, Giovanni Puglisi
2020 J jnl
CoRR
Luca Guarnera, Oliver Giudice, Cristina Nastasi, Sebastiano Battiato
2020 B conf
ICIP
Oliver Giudice, Mattia Litrico, Sebastiano Battiato
2020 J jnl
CoRR
Oliver Giudice, Mattia Litrico, Sebastiano Battiato
2019 conf
ICIAP (2)
Oliver Giudice, Francesco Guarnera, Antonino Barbaro Paratore, Sebastiano Battiato
2019 B conf
ICIP
Francesco Guarnera, Dario Allegra, Oliver Giudice, Filippo Stanco, Sebastiano Battiato
2019 B conf
ICIP
Oliver Giudice, Luca Guarnera, Antonino Barbaro Paratore, Giovanni Maria Farinella, Sebastiano Battiato
2018 B conf
ICIP
Oliver Giudice, Dario Allegra, Filippo Stanco, Giorgio M. Grasso, Sebastiano Battiato
2018 J jnl
Comput. Ind.
Sebastiano Battiato, Giovanni Maria Farinella, Giovanni Gallo, Oliver Giudice
2017 conf
ICIAP (2)
Oliver Giudice, Antonino Barbaro Paratore, Marco Moltisanti, Sebastiano Battiato
2016 J jnl
CoRR
Oliver Giudice, Antonino Barbaro Paratore, Marco Moltisanti, Sebastiano Battiato
2016 J jnl
Multim. Tools Appl.
Sebastiano Battiato, Giovanni Maria Farinella, Oliver Giudice, Giovanni Puglisi
2016 conf
CompSysTech
Sebastiano Battiato, Oliver Giudice, Antonino Barbaro Paratore
2013 conf
ICIAP (1)
Sebastiano Battiato, Stefano Cafiso, Alessandro Di Graziano, Giovanni Maria Farinella, Oliver Giudice
2012 B conf
ICPR
Sebastiano Battiato, Giovanni Maria Farinella, Oliver Giudice, Giovanni Puglisi
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"