Casper Lassenius

115 papers A* 2A 12B 7C 15Journal 47Unranked 29
YearRankTypeTitle / Venue / Authors
2026 B conf
XP
Lucas Rocha, Fabiana Freitas Mendes, Maria Paasivaara, Casper Lassenius
2025 J jnl
Empir. Softw. Eng.
Casper Lassenius, Parastoo Mohagheghi, Jefferson Seide Molléri
2025 conf
CHASE@ICSE
Casper Lassenius, Torgeir Dingsøyr
2025 J jnl
CoRR
Casper Lassenius, Torgeir Dingsøyr
2024 J jnl
Empir. Softw. Eng.
Abheeshta Putta, Maria Paasivaara, Casper Lassenius
2023 J jnl
J. Syst. Softw.
Jefferson Seide Molléri, Casper Lassenius, Magne Jørgensen
2023 A conf
ESEM
Irina Safonova, Maria Paasivaara, Casper Lassenius, Ömer Uludag, Abheeshta Putta
2022 A ed.
ESEM
Fernanda Madeiral, Casper Lassenius, Tayana Conte, Tomi Männistö
2022 J jnl
J. Syst. Softw.
Ömer Uludag, Pascal Philipp, Abheeshta Putta, Maria Paasivaara, Casper Lassenius, Florian Matthes
2021 B ed.
XP
Peggy Gregory, Casper Lassenius, Xiaofeng Wang, Philippe Kruchten
2021 J jnl
Inf. Softw. Technol.
Abdoul-Djawadou Salaou, Daniela E. Damian, Casper Lassenius, Dragos Voda, Pierre Gançarski
2021 J jnl
CoRR
Jefferson Seide Molléri, Casper Lassenius, Magne Jørgensen
2021 J jnl
Empir. Softw. Eng.
Nils Brede Moe, Darja Smite, Maria Paasivaara, Casper Lassenius
2021 conf
ESEC/SIGSOFT FSE
Parastoo Mohagheghi, Casper Lassenius
2021 C conf
Software Engineering
Stefan Wagner, Daniel Méndez Fernández, Michael Felderer, Antonio Vetrò, Marcos Kalinowski, Roel J. Wieringa, Dietmar Pfahl, Tayana Conte, Marie-Therese Christiansson, Desmond Greer, Casper Lassenius, Tomi Männistö, Maleknaz Nayebi, Markku Oivo, Birgit Penzenstadler, Rafael Prikladnicki, Guenther Ruhe, André Schekelmann, Sagar Sen, Rodrigo O. Spínola, Ahmet Tuzcu, Jose Luis de la Vara, Dietmar Winkler
2021 A conf
ESEM
Abheeshta Putta, Ömer Uludag, Shun-Long Hong, Maria Paasivaara, Casper Lassenius
2020 conf
XP Workshops
Parastoo Mohagheghi, Casper Lassenius, Ingrid Omang Bakken
2020 J jnl
CoRR
Ömer Uludag, Pascal Philipp, Abheeshta Putta, Maria Paasivaara, Casper Lassenius, Florian Matthes
2020 J jnl
IEEE Softw.
Rafael Prikladnicki, Casper Lassenius, Jeffrey C. Carver
2019 conf
ICSE (SEET)
Maria Paasivaara, Jari Vanhanen, Casper Lassenius
2019 J jnl
Inf. Softw. Technol.
Lucy Ellen Lwakatare, Terhi Kilamo, Teemu Karvonen, Tanja Sauvola, Ville Heikkilä, Juha Itkonen, Pasi Kuvaja, Tommi Mikkonen, Markku Oivo, Casper Lassenius
2019 J jnl
IEEE Softw.
Maria Paasivaara, Casper Lassenius
2019 B conf
XP
Abheeshta Putta, Maria Paasivaara, Casper Lassenius
2019 J jnl
ACM Trans. Softw. Eng. Methodol.
Stefan Wagner, Daniel Méndez Fernández, Michael Felderer, Antonio Vetrò, Marcos Kalinowski, Roel J. Wieringa, Dietmar Pfahl, Tayana Conte, Marie-Therese Christiansson, Desmond Greer, Casper Lassenius, Tomi Männistö, Maleknaz Nayebi, Markku Oivo, Birgit Penzenstadler, Rafael Prikladnicki, Guenther Ruhe, André Schekelmann, Sagar Sen, Rodrigo O. Spínola, Ahmet Tuzcu, Jose Luis de la Vara, Dietmar Winkler
2019 J jnl
IEEE Softw.
Rafael Prikladnicki, Casper Lassenius, Jeffrey C. Carver
2018 conf
XP Companion
Abheeshta Putta, Maria Paasivaara, Casper Lassenius
2018 B conf
PROFES
Abheeshta Putta, Maria Paasivaara, Casper Lassenius
2018 J jnl
Empir. Softw. Eng.
Eero I. Laukkanen, Maria Paasivaara, Juha Itkonen, Casper Lassenius
2018 J jnl
Inf. Softw. Technol.
Tommi Mikkonen, Casper Lassenius, Tomi Männistö, Markku Oivo, Janne Järvinen
2018 conf
ICSE (SEET)
Maria Paasivaara, Dragos Voda, Ville T. Heikkilä, Jari Vanhanen, Casper Lassenius
2018 J jnl
Empir. Softw. Eng.
Maria Paasivaara, Benjamin Behm, Casper Lassenius, Minna Hallikainen
2018 J jnl
J. Syst. Softw.
Jari Vanhanen, Timo O. A. Lehtinen, Casper Lassenius
2018 J jnl
CoRR
Stefan Wagner, Daniel Méndez Fernández, Michael Felderer, Antonio Vetrò, Marcos Kalinowski, Roel J. Wieringa, Dietmar Pfahl, Tayana Conte, Marie-Therese Christiansson, Desmond Greer, Casper Lassenius, Tomi Männistö, Maleknaz Nayebi, Markku Oivo, Birgit Penzenstadler, Rafael Prikladnicki, Guenther Ruhe, André Schekelmann, Sagar Sen, Rodrigo O. Spínola, Ahmet Tuzcu, Jose Luis de la Vara, Dietmar Winkler
2018 J jnl
IEEE Softw.
Rafael Prikladnicki, Casper Lassenius, Jeffrey C. Carver
2017 conf
ICSE-SEET
Maria Paasivaara, Jari Vanhanen, Ville T. Heikkilä, Casper Lassenius, Juha Itkonen, Eero I. Laukkanen
2017 J jnl
Empir. Softw. Eng.
Ville T. Heikkilä, Maria Paasivaara, Casper Lassenius, Daniela E. Damian, Christian Engblom
2017 J jnl
Empir. Softw. Eng.
Daniel Méndez Fernández, Stefan Wagner, Marcos Kalinowski, Michael Felderer, Priscilla Mafra, Antonio Vetrò, Tayana Conte, Marie-Therese Christiansson, Des Greer, Casper Lassenius, Tomi Männistö, M. Nayabi, Markku Oivo, Birgit Penzenstadler, Dietmar Pfahl, Rafael Prikladnicki, Günther Ruhe, André Schekelmann, Sagar Sen, Rodrigo O. Spínola, Ahmet Tuzcu, Jose Luis de la Vara, Roel J. Wieringa
2017 J jnl
Inf. Softw. Technol.
Eero I. Laukkanen, Juha Itkonen, Casper Lassenius
2017 J jnl
Empir. Softw. Eng.
Timo O. A. Lehtinen, Juha Itkonen, Casper Lassenius
2017 conf
ICSE-SEIP
Eero I. Laukkanen, Maria Paasivaara, Juha Itkonen, Casper Lassenius, Teemu Arvonen
2016 A conf
ESEM
Eero I. Laukkanen, Timo O. A. Lehtinen, Juha Itkonen, Maria Paasivaara, Casper Lassenius
2016 conf
XP Workshops
Maria Paasivaara, Casper Lassenius
2016 J jnl
J. Syst. Softw.
Kim-Karol Dikert, Maria Paasivaara, Casper Lassenius
2016 J jnl
Inf. Softw. Technol.
Torgeir Dingsøyr, Casper Lassenius
2016 J jnl
Comput. Stand. Interfaces
Alok Mishra, Jürgen Münch, Casper Lassenius, Deepti Mishra
2016 J jnl
CoRR
Daniel Méndez Fernández, Stefan Wagner, Marcos Kalinowski, Michael Felderer, Priscilla Mafra, Antonio Vetrò, Tayana Conte, Marie-Therese Christiansson, Des Greer, Casper Lassenius, Tomi Männistö, M. Nayabi, Markku Oivo, Birgit Penzenstadler, Dietmar Pfahl, Rafael Prikladnicki, Günther Ruhe, André Schekelmann, Sagar Sen, Rodrigo O. Spínola, Ahmet Tuzcu, Jose Luis de la Vara, Roel J. Wieringa
2016 A conf
ESEM
Juha Itkonen, Raoul Udd, Casper Lassenius, Timo Lehtonen
2016 J jnl
J. Syst. Softw.
Kari Smolander, Casper Lassenius, Matti Rossi
2016 C conf
ICGSE
Maria Paasivaara, Casper Lassenius
2016 conf
ICSE (Companion Volume)
Ville T. Heikkilä, Maria Paasivaara, Casper Lassenius
2016 J jnl
IEEE Softw.
Juha Itkonen, Mika V. Mäntylä, Casper Lassenius
2016 J jnl
IEEE Softw.
Rafael Prikladnicki, Casper Lassenius, Evelyn Tian, Jeffrey C. Carver
2015 conf
EUROMICRO-SEAA
Ville T. Heikkilä, Daniela E. Damian, Casper Lassenius, Maria Paasivaara
2015 B ed.
XP
Casper Lassenius, Torgeir Dingsøyr, Maria Paasivaara
2015 A conf
ICST
Timo Huuhtanen, Juha Itkonen, Casper Lassenius
2015 conf
ICSE (2)
Maria Paasivaara, Kelly Blincoe, Casper Lassenius, Daniela E. Damian, Jyoti Sheoran, Francis Harrison, Prashant Chhabra, Aminah Yussuf, Veikko Isotalo
2015 J jnl
Inf. Softw. Technol.
Ville Heikkilä, Maria Paasivaara, Kristian Rautiainen, Casper Lassenius, Towo Toivola, Janne Järvinen
2015 J jnl
CoRR
Keiichi Nemoto, Peter A. Gloor, Cristobal J. Garcia, Julia Gluesing, Takashi Iba, Casper Lassenius, Christine Miller, Maria Paasivaara, Ken Riopelle
2014 J jnl
Inf. Softw. Technol.
Timo O. A. Lehtinen, Risto Virtanen, Juha O. Viljanen, Mika Mäntylä, Casper Lassenius
2014 J jnl
J. Softw. Evol. Process.
Maria Paasivaara, Casper Lassenius
2014 J jnl
Inf. Softw. Technol.
Maria Paasivaara, Casper Lassenius
2014 conf
AGILE
Maria Paasivaara, Casper Lassenius
2014 J jnl
Inf. Softw. Technol.
Timo O. A. Lehtinen, Mika Mäntylä, Jari Vanhanen, Juha Itkonen, Casper Lassenius
2014 ed.
ICSOB
Casper Lassenius, Kari Smolander
2014 conf
XP Workshops
Maria Paasivaara, Outi Väättänen, Minna Hallikainen, Casper Lassenius
2014 conf
ICSE Companion
Maria Paasivaara, Ville Heikkilä, Casper Lassenius, Towo Toivola
2014 A* conf
ICSE
Mika Mäntylä, Kai Petersen, Timo O. A. Lehtinen, Casper Lassenius
2014 C conf
ICGSE
Maria Paasivaara, Benjamin Behm, Casper Lassenius, Minna Hallikainen
2013 J jnl
CoRR
Petteri Räty, Benjamin Behm, Kim-Karol Dikert, Maria Paasivaara, Casper Lassenius, Daniela E. Damian
2013 B conf
XP
Ville Heikkilä, Maria Paasivaara, Casper Lassenius, Christian Engblom
2013 C conf
ICGSE
Maria Paasivaara, Casper Lassenius, Ville Heikkilä, Kim-Karol Dikert, Christian Engblom
2013 J jnl
CoRR
Cristobal J. Garcia, Peter A. Gloor, Julia Gluesing, Casper Lassenius, Christine Miller, Maria Paasivaara, Ken Riopelle
2013 A conf
ESEM
Ville Heikkilä, Maria Paasivaara, Casper Lassenius
2013 A* conf
ICSE
Maria Paasivaara, Casper Lassenius, Daniela E. Damian, Petteri Räty, Adrian Schröter
2013 J jnl
IEEE Trans. Software Eng.
Juha Itkonen, Mika Mäntylä, Casper Lassenius
2012 A conf
ESEM
Tuomas Jaanu, Maria Paasivaara, Casper Lassenius
2012 C conf
ICGSE
Maria Paasivaara, Ville Heikkilä, Casper Lassenius
2012 J jnl
J. Softw. Maintenance Res. Pract.
Arttu Piri, Tuomas Niinimäki, Casper Lassenius
2012 A conf
ESEM
Maria Paasivaara, Casper Lassenius, Ville Heikkilä
2012 C conf
ICGSE
Tuomas Jaanu, Maria Paasivaara, Casper Lassenius
2012 J jnl
J. Softw. Evol. Process.
Tuomas Niinimäki, Arttu Piri, Casper Lassenius, Maria Paasivaara
2012 conf
CTGDSD@ICSE
Daniela E. Damian, Casper Lassenius, Maria Paasivaara, Arber Borici, Adrian Schröter
2012 conf
EduRex@ICSE
Jari Vanhanen, Timo O. A. Lehtinen, Casper Lassenius
2011 B conf
ICSSP
Maria Paasivaara, Casper Lassenius
2011 conf
ICGSE Workshops
Ville Heikkilä, Casper Lassenius
2011 A conf
ESEM
Maria Paasivaara, Casper Lassenius
2011 conf
CTGDSD@ICSE
Peter A. Gloor, Maria Paasivaara, Casper Lassenius, Detlef Schoder, Kai Fischbach, Christine Miller
2010 C conf
ICGSE
Tuomas Niinimäki, Arttu Piri, Casper Lassenius, Maria Paasivaara
2010 J jnl
IBM J. Res. Dev.
Jarno Vähäniitty, Kristian Rautiainen, Casper Lassenius
2010 ch.
Agility Across Time and Space
Maria Paasivaara, Casper Lassenius
2009 C conf
ICGSE
Arttu Piri, Tuomas Niinimäki, Casper Lassenius
2009 C conf
ICGSE
Tuomas Niinimäki, Arttu Piri, Casper Lassenius
2009 A conf
ESEM
Juha Itkonen, Mika Mäntylä, Casper Lassenius
2009 conf
EUROMICRO-SEAA
Jarno Vähäniitty, Casper Lassenius, Kristian Rautiainen, Pasi Pekkanen
2009 conf
MLMI
Tuomas Niinimäki, Arttu Piri, Peitsa Hynninen, Casper Lassenius
2009 C conf
ICGSE
Maria Paasivaara, Sandra Durasiewicz, Casper Lassenius
2009 J jnl
IEEE Trans. Software Eng.
Mika Mäntylä, Casper Lassenius
2008 C conf
ICGSE
Maria Paasivaara, Sandra Durasiewicz, Casper Lassenius
2008 C conf
ICGSE
Tuomas Niinimäki, Casper Lassenius
2008 J jnl
Softw. Process. Improv. Pract.
Maria Paasivaara, Sandra Durasiewicz, Casper Lassenius
2007 A conf
ESEM
Juha Itkonen, Mika Mäntylä, Casper Lassenius
2007 C conf
ICSEA
Jari Vanhanen, Casper Lassenius, Mika Mäntylä
2006 C conf
ICGSE
Maria Paasivaara, Casper Lassenius
2006 conf
ISESE
Mika Mäntylä, Casper Lassenius
2006
Casper Lassenius
2006 J jnl
Empir. Softw. Eng.
Mika Mäntylä, Casper Lassenius
2005 conf
ISESE
Jari Vanhanen, Casper Lassenius
2004 conf
ICSM
Mika Mäntylä, Jari Vanhanen, Casper Lassenius
2003 conf
ICSM
Mika Mäntylä, Jari Vanhanen, Casper Lassenius
2003 conf
ISESE
Kristian Rautiainen, Lauri Vuornos, Casper Lassenius
2003 J jnl
Softw. Process. Improv. Pract.
Maria Paasivaara, Casper Lassenius
2002 conf
HICSS
Kristian Rautiainen, Casper Lassenius, Jarno Vähäniitty, Maaret Pyhäjärvi, Jari Vanhanen
2000 conf
HICSS
Kristian Rautiainen, Maarit Nissinen, Casper Lassenius
1997 conf
HICSS (1)
Kari Alho, Casper Lassenius, Reijo Sulonen
1995 C conf
WETICE
Kari Alho, Casper Lassenius, Reijo Sulonen
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"