Vincent Baltazart

25 papers B 1C 1Journal 17Unranked 6
YearRankTypeTitle / Venue / Authors
2022 J jnl
Sensors
Bian Xiong, Qinghua Zhang, Vincent Baltazart
2021 J jnl
Remote. Sens.
Xavier Dérobert, Vincent Baltazart, Jean-Michel Simonin, Shreedhar Savant Todkar, Christophe Norgeot, Ho-Yan Hui
2021 J jnl
Sensors
Martin Fontaine, Alex Coiret, Julien Cesbron, Vincent Baltazart, David Bétaille
2021 J jnl
Remote. Sens.
Bachir Tchana Tankeu, Vincent Baltazart, Yide Wang, David Guilbert
2021 J jnl
IEEE Trans. Geosci. Remote. Sens.
Jingjing Pan, Meng Sun, Yide Wang, Cédric Le Bastard, Vincent Baltazart
2020 J jnl
Signal Process.
Jingjing Pan, Meng Sun, Yide Wang, Cédric Le Bastard, Vincent Baltazart
2020 conf
EUSIPCO
Bian Xiong, Qinghua Zhang, Vincent Baltazart
2019 J jnl
IEEE Geosci. Remote. Sens. Lett.
Cédric Le Bastard, Jingjing Pan, Yide Wang, Meng Sun, Shreedhar Savant Todkar, Vincent Baltazart, Nicolas Pinel, Amine Ihamouten, Xavier Dérobert, Christophe Bourlier
2019 J jnl
Vis. Comput.
Wissam Kaddah, Marwa Elbouz, Yousri Ouerhani, Vincent Baltazart, Marc Desthieux, Ayman Alfalou
2018 C conf
IGARSS
Shreedhar Savant Todkar, Cédric Le Bastard, Vincent Baltazart, Amine Ihamouten, Xavier Dérobert
2018 J jnl
IEEE Trans. Geosci. Remote. Sens.
Meng Sun, Cédric Le Bastard, Yide Wang, Nicolas Pinel, Jingjing Pan, Vincent Baltazart, Jean-Michel Simonin, Xavier Dérobert
2017 conf
EUSIPCO
Vincent Baltazart, Philippe Nicolle, L. Yang
2017 conf
EUSIPCO
Vincent Baltazart, L. Yang, Philippe Nicolle, Jean-Marc Moliard
2016 J jnl
IEEE Trans. Intell. Transp. Syst.
Rabih Amhaz, Sylvie Chambon, Jérôme Idier, Vincent Baltazart
2016 J jnl
Circuits Syst. Signal Process.
Khaled Chahine, Vincent Baltazart, Yide Wang
2015 J jnl
IEEE Trans. Geosci. Remote. Sens.
Christophe Bourlier, Cédric Le Bastard, Vincent Baltazart
2014 B conf
ICIP
Rabih Amhaz, Sylvie Chambon, Jérôme Idier, Vincent Baltazart
2014 J jnl
IEEE Geosci. Remote. Sens. Lett.
Cédric Le Bastard, Yide Wang, Vincent Baltazart, Xavier Dérobert
2011 J jnl
IEEE Trans. Instrum. Meas.
Amine Ihamouten, Khaled Chahine, Vincent Baltazart, Géraldine Villain, Xavier Dérobert
2010 J jnl
Signal Process.
Khaled Chahine, Vincent Baltazart, Yide Wang
2010 J jnl
Signal Process.
Cédric Le Bastard, Vincent Baltazart, Yide Wang
2009 conf
EUSIPCO
Khaled Chahine, Vincent Baltazart, Yide Wang, Xavier Dérobert, Cédric Le Bastard
2008 conf
EUSIPCO
Cédric Le Bastard, Vincent Baltazart, Yide Wang, Xavier Dérobert, Joseph Saillard
2007 conf
EUSIPCO
Cédric Le Bastard, Vincent Baltazart, Yide Wang
2007 J jnl
IEEE Trans. Geosci. Remote. Sens.
Cédric Le Bastard, Vincent Baltazart, Yide Wang, Joseph Saillard
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"