Vasileios Gkioulos

77 papers B 5Misc 1Journal 44Unranked 26
YearRankTypeTitle / Venue / Authors
2026 J jnl
Inf.
Konstantinos E. Kampourakis, Vasileios Gkioulos, Sokratis K. Katsikas
2026 J jnl
Comput. Stand. Interfaces
Samson O. Oruma, Mary Sánchez-Gordón, Vasileios Gkioulos
2026 J jnl
Syst.
Samson Ogheneovo Oruma, Ricardo Colomo-Palacios, Vasileios Gkioulos
2026 J jnl
CoRR
Michail Takaronis, Athanasia Kollarou, Vyron Kampourakis, Vasileios Gkioulos, Sokratis K. Katsikas
2025 J jnl
J. Inf. Secur. Appl.
Vyron Kampourakis, Vasileios Gkioulos, Sokratis K. Katsikas
2025 J jnl
Int. J. Inf. Sec.
Samson O. Oruma, Ricardo Colomo-Palacios, Vasileios Gkioulos
2025 conf
HCI (49)
Gizem Erceylan, Aida Akbarzadeh, Vasileios Gkioulos
2025 J jnl
Comput. Secur.
Vyron Kampourakis, Georgios Kavallieratos, Vasileios Gkioulos, Sokratis K. Katsikas
2025 J jnl
Int. J. Inf. Sec.
Konstantinos E. Kampourakis, Vasileios Gkioulos, Georgios Kavallieratos, Jia-Chun Lin
2025 J jnl
CoRR
Samson O. Oruma, Ricardo Colomo-Palacios, Vasileios Gkioulos
2025 J jnl
CoRR
Vyron Kampourakis, Christos Smiliotopoulos, Vasileios Gkioulos, Sokratis K. Katsikas
2025 J jnl
CoRR
Vyron Kampourakis, Georgios Kavallieratos, Georgios P. Spathoulas, Vasileios Gkioulos, Sokratis K. Katsikas
2025 J jnl
Int. J. Inf. Sec.
Gizem Erceylan, Aida Akbarzadeh, Vasileios Gkioulos
2025 ed.
SUNRISE
Habtamu Abie, Vasileios Gkioulos, Sokratis K. Katsikas, Sandeep Pirbhulal
2025 J jnl
Int. J. Inf. Sec.
Doney Abraham, Gizem Erceylan, Vasileios Gkioulos, Siv Hilde Houmb
2024 J jnl
Int. J. Inf. Sec.
Aybars Oruc, Nabin Chowdhury, Vasileios Gkioulos
2024 J jnl
Int. J. Inf. Sec.
Jessica B. Heluany, Vasileios Gkioulos
2024 conf
ESORICS Workshops (2)
Georgios Kavallieratos, Ahmed Amro, Vasileios Gkioulos, Grigore Stamatescu, Kostantinos Rantos, Thomas Lagkas, Konstantinos Demertzis, Fotis Paterakis, Alexios Lekidis, Christos Dalamagkas, Igor Kotsiuba, Sokratis K. Katsikas
2024 conf
EnCyCriS/SVM
Jessica B. Heluany, Ahmed Amro, Vasileios Gkioulos, Sokratis K. Katsikas
2024 B conf
ARES
Markus Wurzenberger, Stephan Krenn, Max Landauer, Florian Skopik, Cora Lisa Perner, Jarno Lötjönen, Jani Päijänen, Georgios Gardikis, Nikos Alabasis, Liisa Sakerman, Kristiina Omri, Juha Röning, Kimmo Halunen, Vincent Thouvenot, Martin Weise, Andreas Rauber, Vasileios Gkioulos, Sokratis K. Katsikas, Luigi Sabetta, Jacopo Bonato, Rocío Ortíz, Daniel Navarro, Nikolaos Stamatelatos, Ioannis Avdoulas, Rudolf Mayer, Andreas Ekelhart, Ioannis Giannoulakis, Emmanouil Kafetzakis, Antonello Corsi, Ulrike Lechner, Corinna Schmitt
2024 conf
EnCyCriS/SVM
Xhesika Ramaj, Mary Sánchez-Gordón, Vasileios Gkioulos, Ricardo Colomo-Palacios
2024 J jnl
Int. J. Inf. Sec.
Ivar Moen, Aybars Oruc, Ahmed Amro, Vasileios Gkioulos, Georgios Kavallieratos
2024 conf
HCI (46)
Xhesika Ramaj, Mary Sánchez-Gordón, Ricardo Colomo-Palacios, Vasileios Gkioulos
2024 B conf
ARES
Jessica B. Heluany, Johannes Götzfried, Bernhard Mehlig, Vasileios Gkioulos
2023 J jnl
Int. J. Inf. Sec.
Nabin Chowdhury, Vasileios Gkioulos
2023 J jnl
Comput. Sci. Rev.
Sunil Chaudhary, Vasileios Gkioulos, Sokratis K. Katsikas
2023 J jnl
Comput. Secur.
Vyron Kampourakis, Vasileios Gkioulos, Sokratis K. Katsikas
2023 J jnl
ACM Trans. Priv. Secur.
Ahmed Amro, Vasileios Gkioulos, Sokratis K. Katsikas
2023 J jnl
Int. J. Inf. Sec.
Ahmed Amro, Vasileios Gkioulos
2023 conf
ESORICS Workshops (1)
Susanne Barkhald Sandberg, Aida Akbarzadeh, Vasileios Gkioulos
2023 B conf
ARES
Jessica B. Heluany, Vasileios Gkioulos
2023 conf
EuroSPI (1)
Xhesika Ramaj, Ricardo Colomo-Palacios, Mary Sánchez-Gordón, Vasileios Gkioulos
2023 conf
Privacy and Identity Management
Aida Akbarzadeh, Sabarathinam Chockalingam, Xhesika Ramaj, Lama Amro, Mary Sánchez-Gordón, Vasileios Gkioulos, Ricardo Colomo-Palacios, László Erdodi, Nathan Lau, Siv Hilde Houmb
2022 conf
CyberICPS/SECPRE/SPOSE/CPS4CIP/CDT&SECOMAN/EIS/SecAssure@ESORICS
Nabin Chowdhury, Vasileios Gkioulos
2022 J jnl
Comput.
Samson O. Oruma, Mary Sánchez-Gordón, Ricardo Colomo-Palacios, Vasileios Gkioulos, Joakim K. Hansen
2022 J jnl
Sensors
Aybars Oruc, Ahmed Amro, Vasileios Gkioulos
2022 conf
CyberSec4Europe
Sunil Chaudhary, Vasileios Gkioulos
2022 conf
CyberICPS/SECPRE/SPOSE/CPS4CIP/CDT&SECOMAN/EIS/SecAssure@ESORICS
Sunil Chaudhary, Vasileios Gkioulos, David Goodman
2022 J jnl
J. Cybersecur.
Sunil Chaudhary, Vasileios Gkioulos, Sokratis K. Katsikas
2022 conf
ESORICS (3)
Ahmed Amro, Vasileios Gkioulos
2022 J jnl
Comput. Secur.
Nabin Chowdhury, Sokratis K. Katsikas, Vasileios Gkioulos
2022 J jnl
Inf.
Ahmed Amro, Aybars Oruc, Vasileios Gkioulos, Sokratis K. Katsikas
2022 B conf
ARES
Sunil Chaudhary, Marko Kompara, Sebastian Pape, Vasileios Gkioulos
2021 J jnl
Int. J. Crit. Infrastructure Prot.
Sandeep Pirbhulal, Vasileios Gkioulos, Sokratis K. Katsikas
2021 conf
CyberICPS/SECPRE/ADIoT/SPOSE/CPS4CIP/CDT&SECOMANE@ESORICS
Ahmed Amro, Vasileios Gkioulos
2021 J jnl
Comput. Sci. Rev.
Nabin Chowdhury, Vasileios Gkioulos
2021 J jnl
Inf. Comput. Secur.
Nabin Chowdhury, Vasileios Gkioulos
2021 J jnl
Digit.
Panagiotis I. Radoglou-Grammatikis, Panagiotis G. Sarigiannidis, Christos Dalamagkas, Yannis Spyridis, Thomas Lagkas, Georgios Efstathopoulos, Achilleas Sesis, Ignacio Labrador Pavón, Rubén Trapero Burgos, Rodrigo Diaz Rodriguez, Antonios Sarigiannidis, Dimitrios Papamartzivanos, Sofia-Anna Menesidou, Giannis Ledakis, Achilleas Pasias, Thanasis Kotsiopoulos, Anastasios Drosou, Orestis Mavropoulos, Alba Colet-Subirachs, Pol Paradell Sola, José Luis Domínguez-García, Marisa Escalante, Alberto Molinuevo Martín, Benito Caracuel, Francisco Ramos, Vasileios Gkioulos, Sokratis K. Katsikas, Hans Christian Bolstad, Dan-Eric Archer, Nikola Paunovic, Ramon Gallart-Fernandez, Theodoros Rokkas, Alicia Arce
2021 conf
ETAA
Mehari Msgna, Sokratis K. Katsikas, Vasileios Gkioulos
2020 J jnl
Comput. Secur.
Muhammad Mudassar Yamin, Basel Katt, Vasileios Gkioulos
2020 J jnl
Future Internet
Georgios Kavallieratos, Sokratis K. Katsikas, Vasileios Gkioulos
2020 conf
ACIIDS (2)
Georgios Kavallieratos, Sokratis K. Katsikas, Vasileios Gkioulos
2020 J jnl
Sensors
Christina Michailidou, Vasileios Gkioulos, Andrii Shalaginov, Athanasios Rizos, Andrea Saracino
2020 J jnl
Future Internet
Philip Nyblom, Gaute Wangen, Vasileios Gkioulos
2020 J jnl
Comput. Stand. Interfaces
Georgios Kavallieratos, Sokratis K. Katsikas, Vasileios Gkioulos
2020 J jnl
Sensors
Sokratis K. Katsikas, Vasileios Gkioulos
2019 J jnl
Future Internet
Håkon Gunleifsen, Thomas Kemmerich, Vasileios Gkioulos
2019 conf
CyberICPS/SECPRE/SPOSE/ADIoT@ESORICS
Ahmed Amro, Vasileios Gkioulos, Sokratis K. Katsikas
2019 conf
HAISA
Håkon Gunleifsen, Vasileios Gkioulos, Gaute Wangen, Andrii Shalaginov, Mazaher Kianpour, Mohamed Abomhara
2019 J jnl
Comput. Networks
Håkon Gunleifsen, Thomas Kemmerich, Vasileios Gkioulos
2019 J jnl
Future Internet
Georgios Kavallieratos, Nabin Chowdhury, Sokratis K. Katsikas, Vasileios Gkioulos, Stephen D. Wolthusen
2019 B conf
DCOSS
Georgios Kavallieratos, Vasileios Gkioulos, Sokratis K. Katsikas
2019 conf
CPSS@AsiaCCS
Georgios Kavallieratos, Sokratis K. Katsikas, Vasileios Gkioulos
2018 J jnl
Future Internet
Vasileios Gkioulos, Håkon Gunleifsen, Goitom K. Weldehawaryat
2018 J jnl
Future Internet
Håkon Gunleifsen, Vasileios Gkioulos, Thomas Kemmerich
2018 conf
CyberICPS/SECPRE@ESORICS
Georgios Kavallieratos, Sokratis K. Katsikas, Vasileios Gkioulos
2018 conf
HPCS
Vasileios Gkioulos, Athanasios Rizos, Christina Michailidou, Fabio Martinelli, Paolo Mori
2018 conf
CyberICPS/SECPRE@ESORICS
Vasileios Gkioulos, Athanasios Rizos, Christina Michailidou, Paolo Mori, Andrea Saracino
2017 J jnl
Inf.
Vasileios Gkioulos, Gaute Wangen, Sokratis K. Katsikas, George K. Karagiannidis, Panayiotis Kotzanikolaou
2017 Misc conf
CISIS
Vasileios Gkioulos, Stephen D. Wolthusen
2017 conf
MMM-ACNS
Vasileios Gkioulos, Stephen D. Wolthusen
2017 J jnl
J. Inf. Secur. Appl.
Vasileios Gkioulos, Erko Risthein, Stephen D. Wolthusen
2017 J jnl
Future Internet
Vasileios Gkioulos, Gaute Wangen, Sokratis K. Katsikas
2016 conf
CyberICPS@ESORICS
Vasileios Gkioulos, Stephen D. Wolthusen
2016 conf
FNSS
Vasileios Gkioulos, Stephen D. Wolthusen
2016 conf
SSCI
Vasileios Gkioulos, Stephen D. Wolthusen, Adam Flizikowski, Anna Stachowicz, Dariusz Nogalski, Kamil Gleba, Joanna Sliwa
2016 conf
SSIC
Vasileios Gkioulos, Stephen D. Wolthusen
redb/extractors/apk_extractors/apk_manifest.py
← Index redb/extractors/apk_extractors/apk_manifest.py python
import inspect
import json
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 APKManifest, APKManifestComponent


class APKManifestExtractor(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.manifest = None
        self.components = []
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.APK_MANIFEST.value

    def _is_component_exported(self, component_type, component_name):
        """Determine if a component is exported.

        Pre-API 31: exported is implicitly True if intent filters exist.
        API 31+: android:exported must be explicit; default is False.
        """
        try:
            exported_attr = None
            # Try to get the exported attribute directly from the XML
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                for node in axml.getElementsByTagName(component_type):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    if name == component_name:
                        exported_attr = node.getAttributeNS(
                            "http://schemas.android.com/apk/res/android", "exported"
                        )
                        break
        except Exception:
            exported_attr = None

        if exported_attr == "true":
            return True
        if exported_attr == "false":
            return False

        # If not explicitly set, check for intent filters (pre-API 31 behavior)
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                if actions:
                    return True
        except Exception:
            pass

        return False

    def _get_intent_filters_for_component(self, component_type, component_name):
        """Get intent filters for a specific component."""
        actions = []
        categories = []
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                categories = intent_filters.get("category", [])
        except Exception:
            pass
        return actions, categories

    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 manifest 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

        activities = self._safe_extract(
            "activities", lambda: list(self.apk.get_activities() or []), []
        )
        services = self._safe_extract(
            "services", lambda: list(self.apk.get_services() or []), []
        )
        receivers = self._safe_extract(
            "receivers", lambda: list(self.apk.get_receivers() or []), []
        )
        providers = self._safe_extract(
            "providers", lambda: list(self.apk.get_providers() or []), []
        )

        # Build component list with intent filter info
        self.components = []
        all_actions = set()
        all_categories = set()
        exported_components = []

        component_map = [
            ("activity", activities),
            ("service", services),
            ("receiver", receivers),
            ("provider", providers),
        ]

        for comp_type, comp_list in component_map:
            for comp_name in comp_list:
                try:
                    is_exported = self._is_component_exported(comp_type, comp_name)
                    actions, categories = self._get_intent_filters_for_component(
                        comp_type, comp_name
                    )
                    all_actions.update(actions)
                    all_categories.update(categories)
                    if is_exported:
                        exported_components.append(comp_name)

                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=is_exported,
                        intent_actions=list(actions),
                        intent_categories=list(categories),
                    ))
                except Exception as e:
                    self.log.warning(
                        f"Error processing component '{comp_name}' for "
                        f"{self.hash.sha256}: {e}"
                    )
                    # Still add the component with minimal info
                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=False,
                        intent_actions=[],
                        intent_categories=[],
                    ))

        # Uses-feature
        uses_features = []
        try:
            uses_features = list(self.apk.get_features() or [])
        except Exception:
            pass

        # Meta-data
        meta_data = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                md = {}
                for node in axml.getElementsByTagName("meta-data"):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    value = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "value"
                    )
                    resource = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "resource"
                    )
                    if name:
                        md[name] = value or resource or ""
                if md:
                    meta_data = md
        except Exception:
            pass

        # Full manifest XML
        manifest_xml = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                manifest_xml = axml.toxml()
        except Exception:
            try:
                manifest_xml = self.apk.get_android_manifest_axml().get_xml()
                if isinstance(manifest_xml, bytes):
                    manifest_xml = manifest_xml.decode("utf-8", errors="replace")
            except Exception:
                pass

        self.manifest = APKManifest(
            activity_count=len(activities),
            service_count=len(services),
            receiver_count=len(receivers),
            provider_count=len(providers),
            activities=activities,
            services=services,
            receivers=receivers,
            providers=providers,
            exported_components=exported_components,
            intent_filters_by_action=sorted(all_actions),
            intent_filters_by_category=sorted(all_categories),
            uses_features=uses_features,
            meta_data=meta_data,
            manifest_xml=manifest_xml,
        )
        return self.manifest

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.manifest:
                return None

            current_time = datetime.now(timezone.utc)
            m = self.manifest

            # Components table (one row per component)
            components_data = []
            for comp in self.components:
                components_data.append([
                    self.sha256,
                    comp.component_type,
                    comp.class_name,
                    int(comp.is_exported),
                    comp.intent_actions,
                    comp.intent_categories,
                    current_time,
                ])

            # Manifest summary table (one row per APK)
            manifest_data = [[
                self.sha256,
                m.activity_count,
                m.service_count,
                m.receiver_count,
                m.provider_count,
                m.intent_filters_by_action,
                m.intent_filters_by_category,
                m.uses_features,
                m.manifest_xml,
                current_time,
            ]]

            return {
                'multi_table': True,
                'manifest': {
                    'table': 'redb_apk_manifest',
                    'data': manifest_data,
                    'column_names': [
                        'sha256',
                        'activity_count', 'service_count', 'receiver_count', 'provider_count',
                        'intent_filters_by_action', 'intent_filters_by_category',
                        'uses_features', 'manifest_xml', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)',
                        'UInt16', 'UInt16', 'UInt16', 'UInt16',
                        'Array(String)', 'Array(String)',
                        'Array(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'components': {
                    'table': 'redb_apk_components',
                    'data': components_data,
                    'column_names': [
                        'sha256', 'component_type', 'class_name', 'is_exported',
                        'intent_actions', 'intent_categories', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'LowCardinality(String)', 'String', 'UInt8',
                        'Array(String)', 'Array(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
            }

    def get_clickhouse_table(self) -> str:
        return "redb_apk_manifest"