Ievgen Redko

65 papers A* 12A 6B 4Journal 36Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Ambroise Odonnat, Vasilii Feofanov, Laetitia Chapel, Romain Tavenard, Ievgen Redko
2026 J jnl
CoRR
Vasilii Feofanov, Songkang Wen, Jianfeng Zhang, Lujia Pan, Ievgen Redko
2026 J jnl
CoRR
Ambroise Odonnat, Laetitia Chapel, Romain Tavenard, Ievgen Redko
2025 J jnl
CoRR
Shifeng Xie, Vasilii Feofanov, Marius Alonso, Ambroise Odonnat, Jianfeng Zhang, Themis Palpanas, Ievgen Redko
2025 A* conf
CVPR
Quentin Bouniot, Ievgen Redko, Anton Mallasto, Charlotte Laclau, Oliver Struckmeier, Karol Arndt, Markus Heinonen, Ville Kyrki, Samuel Kaski
2025 J jnl
CoRR
Théo Gnassounou, Yessin Moakher, Shifeng Xie, Vasilii Feofanov, Ievgen Redko
2025 J jnl
Trans. Mach. Learn. Res.
Renchunzi Xie, Ambroise Odonnat, Vasilii Feofanov, Ievgen Redko, Jianfeng Zhang, Bo An
2025 J jnl
CoRR
Vasilii Feofanov, Songkang Wen, Marius Alonso, Romain Ilbert, Hongbo Guo, Malik Tiomoko, Lujia Pan, Jianfeng Zhang, Ievgen Redko
2025 J jnl
CoRR
Simon Roschmann, Quentin Bouniot, Vasilii Feofanov, Ievgen Redko, Zeynep Akata
2025 conf
ICDEW
Romain Ilbert, Vasilii Feofanov, Malik Tiomoko, Ievgen Redko, Themis Palpanas
2025 A* conf
ICLR
Abdelhakim Benechehab, Youssef Attia El Hili, Ambroise Odonnat, Oussama Zekri, Albert Thomas, Giuseppe Paolo, Maurizio Filippone, Ievgen Redko, Balázs Kégl
2024 A* conf
NeurIPS
Romain Ilbert, Malik Tiomoko, Cosme Louart, Ambroise Odonnat, Vasilii Feofanov, Themis Palpanas, Ievgen Redko
2024 J jnl
CoRR
Romain Ilbert, Malik Tiomoko, Cosme Louart, Ambroise Odonnat, Vasilii Feofanov, Themis Palpanas, Ievgen Redko
2024 A conf
AISTATS
Pinar Demetci, Quang Huy Tran, Ievgen Redko, Ritambhara Singh
2024 J jnl
CoRR
Oussama Zekri, Abdelhakim Benechehab, Ievgen Redko
2024 J jnl
CoRR
Renchunzi Xie, Ambroise Odonnat, Vasilii Feofanov, Ievgen Redko, Jianfeng Zhang, Bo An
2024 J jnl
CoRR
Oussama Zekri, Ambroise Odonnat, Abdelhakim Benechehab, Linus Bleistein, Nicolas Boullé, Ievgen Redko
2024 A conf
AISTATS
Ambroise Odonnat, Vasilii Feofanov, Ievgen Redko
2024 A* conf
ICML
Romain Ilbert, Ambroise Odonnat, Vasilii Feofanov, Aladin Virmaux, Giuseppe Paolo, Themis Palpanas, Ievgen Redko
2024 J jnl
CoRR
Romain Ilbert, Ambroise Odonnat, Vasilii Feofanov, Aladin Virmaux, Giuseppe Paolo, Themis Palpanas, Ievgen Redko
2024 J jnl
CoRR
Vasilii Feofanov, Romain Ilbert, Malik Tiomoko, Themis Palpanas, Ievgen Redko
2024 J jnl
CoRR
Abdelhakim Benechehab, Youssef Attia El Hili, Ambroise Odonnat, Oussama Zekri, Albert Thomas, Giuseppe Paolo, Maurizio Filippone, Ievgen Redko, Balázs Kégl
2023 J jnl
CoRR
Oliver Struckmeier, Ievgen Redko, Anton Mallasto, Karol Arndt, Markus Heinonen, Ville Kyrki
2023 J jnl
Trans. Mach. Learn. Res.
Oliver Struckmeier, Ievgen Redko, Anton Mallasto, Karol Arndt, Markus Heinonen, Ville Kyrki
2023 J jnl
CoRR
Ambroise Odonnat, Vasilii Feofanov, Ievgen Redko
2023 A* conf
ICML
Brandon Amos, Giulia Luise, Samuel Cohen, Ievgen Redko
2023 J jnl
CoRR
Pinar Demetci, Quang Huy Tran, Ievgen Redko, Ritambhara Singh
2023 A* conf
AAAI
Quang Huy Tran, Hicham Janati, Nicolas Courty, Rémi Flamary, Ievgen Redko, Pinar Demetci, Ritambhara Singh
2023 J jnl
CoRR
Quentin Bouniot, Ievgen Redko, Anton Mallasto, Charlotte Laclau, Karol Arndt, Oliver Struckmeier, Markus Heinonen, Ville Kyrki, Samuel Kaski
2022 conf
ECCV (20)
Quentin Bouniot, Ievgen Redko, Romaric Audigier, Angélique Loesch, Amaury Habrard
2022 J jnl
CoRR
Brandon Amos, Samuel Cohen, Giulia Luise, Ievgen Redko
2022 J jnl
CoRR
Quang Huy Tran, Hicham Janati, Nicolas Courty, Rémi Flamary, Ievgen Redko, Pinar Demetci, Ritambhara Singh
2022 conf
EUSIPCO
Rehan Jhuboo, Ievgen Redko, Alain Guignandon, Françoise Peyrin, Marc Sebban
2021 A conf
AISTATS
Charlotte Laclau, Ievgen Redko, Manvi Choudhary, Christine Largeron
2021 A conf
AISTATS
Nina Vesseron, Ievgen Redko, Charlotte Laclau
2021 J jnl
CoRR
Quang Huy Tran, Hicham Janati, Ievgen Redko, Rémi Flamary, Nicolas Courty
2021 J jnl
J. Mach. Learn. Res.
Rémi Flamary, Nicolas Courty, Alexandre Gramfort, Mokhtar Z. Alaya, Aurélie Boisbunon, Stanislas Chambon, Laetitia Chapel, Adrien Corenflos, Kilian Fatras, Nemo Fournier, Léo Gautheron, Nathalie T. H. Gayraud, Hicham Janati, Alain Rakotomamonjy, Ievgen Redko, Antoine Rolet, Antony Schutz, Vivien Seguy, Danica J. Sutherland, Romain Tavenard, Alexander Tong, Titouan Vayer
2020 A* conf
ICML
Sofien Dhouib, Ievgen Redko, Tanguy Kerdoncuff, Rémi Emonet, Marc Sebban
2020 J jnl
CoRR
Ievgen Redko, Emilie Morvant, Amaury Habrard, Marc Sebban, Younès Bennani
2020 J jnl
CoRR
Charlotte Laclau, Ievgen Redko, Manvi Choudhary, Christine Largeron
2020 A* conf
NeurIPS
Titouan Vayer, Ievgen Redko, Rémi Flamary, Nicolas Courty
2020 J jnl
CoRR
Ievgen Redko, Titouan Vayer, Rémi Flamary, Nicolas Courty
2020 J jnl
CoRR
Nina Vesseron, Ievgen Redko, Charlotte Laclau
2020 A* conf
ICML
Sofien Dhouib, Ievgen Redko, Carole Lartizien
2020 J jnl
CoRR
Quentin Bouniot, Ievgen Redko, Romaric Audigier, Angélique Loesch, Amaury Habrard
2020 J jnl
CoRR
Charlotte Laclau, Franck Iutzeler, Ievgen Redko
2019 A* conf
AAAI
Ievgen Redko, Charlotte Laclau
2019 J jnl
Mach. Learn.
Ievgen Redko, Amaury Habrard, Marc Sebban
2019 A conf
AISTATS
Ievgen Redko, Nicolas Courty, Rémi Flamary, Devis Tuia
2018 A conf
ECIR
Georgios Balikas, Charlotte Laclau, Ievgen Redko, Massih-Reza Amini
2018 J jnl
CoRR
Georgios Balikas, Charlotte Laclau, Ievgen Redko, Massih-Reza Amini
2018 conf
ECML/PKDD (2)
Léo Gautheron, Ievgen Redko, Carole Lartizien
2018 J jnl
CoRR
Léo Gautheron, Ievgen Redko, Carole Lartizien
2018 conf
PRNI
Qi Wang, Ievgen Redko, Sylvain Takerkart
2018 A* conf
NeurIPS
Sofiane Dhouib, Ievgen Redko
2017 A* conf
ICML
Charlotte Laclau, Ievgen Redko, Basarab Matei, Younès Bennani, Vincent Brault
2017 conf
ECML/PKDD (2)
Ievgen Redko, Amaury Habrard, Marc Sebban
2016 J jnl
CoRR
Ievgen Redko, Younès Bennani
2016 B conf
ICPR
Ievgen Redko, Younès Bennani
2016 J jnl
Pattern Recognit. Lett.
Ievgen Redko, Younès Bennani
2016 J jnl
CoRR
Ievgen Redko, Amaury Habrard, Marc Sebban
2015 B conf
IJCNN
Ievgen Redko, Younès Bennani
2014 B conf
IJCNN
Ievgen Redko, Younès Bennani
2014 conf
ICONIP (2)
Ievgen Redko, Younès Bennani
2014 B conf
IJCNN
Ievgen Redko, Younès Bennani
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"