Walter Terkaj

40 papers B 2C 3Journal 8Unranked 20
YearRankTypeTitle / Venue / Authors
2026 ed.
JOWO
John Beverley, C. Maria Keet, Naveen Lamba, Patrick Lambrix, Sanju Tiwari, Stefano De Giorgis, Guendalina Righetti, Gabriele Sacco, João Luiz Rebelo Moreira, Walter Terkaj, Adrien Barton, Mattia Fumagalli, Oliver Kutz, Damion M. Dooley, Davide Audrito, Francesca Grasso, Roberto Nai, Emilio Sulis, Peter L. Elkin, Jeremy Ravenel, Ken Archer, José M. Parente de Oliveira, Alcides Lopes, Luana Bulla, Gabriele Tuccio, Giusy Giulia Tuccari, Ítalo Oliveira, Daniele Francesco Santamaria, Gal Engelberg, Gianpietro Castiglione, Giampaolo Bella, Antonis Bikakis, Roberta Ferrario, Stéphane Jean, Béatrice Markhoff, Alessandro Mosca, Marianna Nicolosi Asmundo, Maria M. Hedblom, Bart Gajderowicz, Daniela Rosu, Janna Hastings, Jacqueline Csonka-Peeren, William D. Duncan, Julie Bowker, Hollen Reischer, Yongun He, Fabrício Henrique Rodrigues, Alessandro Umbrico, Emilio M. Sanfilippo, Fabio Longo
2025 conf
MetroXRAINE
Ludovica Gargiulo, Selen Naz Saritas, Fidan Ezgi Arar, Leonardo Saitta, Matteo De Luca, Ersilia Vallefuoco, Sara Arlati, Marta Mondellini, Nicola Moccaldi, Giovanni D'Errico, Atieh Marhoo, Walter Terkaj, Marco Sacco, Pasquale Arpaia
2025 J jnl
Appl. Ontology
Daniele Porello, Walter Terkaj, Laure Vieu, Emilio M. Sanfilippo, Francesco Compagno
2025 conf
XR (6)
Marta Mondellini, Sara Arlati, Marcello Urgo, Simone L. Pizzagalli, Kashif Mahmood, Walter Terkaj
2025 ed.
LDAC
Walter Terkaj
2025 conf
JOWO
Daniele Spoladore, Andela Ðindic, Walter Terkaj
2024 J jnl
Virtual Real.
Walter Terkaj, Marcello Urgo, Péter Kovács, Erik Tóth, Marta Mondellini
2024 conf
JOWO
Emilio M. Sanfilippo, Walter Terkaj
2024 conf
JOWO
Daniele Porello, Laure Vieu, Walter Terkaj, Stefano Borgo, Francesco Compagno, Emilio M. Sanfilippo
2024 ed.
LDAC
Walter Terkaj, María Poveda-Villalón, Pieter Pauwels
2024 ed.
LDAC
Pieter Pauwels, María Poveda-Villalón, Walter Terkaj
2024 ed.
JOWO
Italo Jose da Silva Oliveira, Pedro Paulo F. Barcelos, Rodrigo F. Calhau, Claudenir M. Fonseca, Guendalina Righetti, Stefano De Giorgis, Gabriele Sacco, Maria M. Hedblom, Oliver Kutz, Martin Glauer, Mirjam Stappel, Cássia Trojahn, María Poveda-Villalón, Daniel Garijo, César Henrique Bernabé, Asiyah Yu Lin, Francesco Compagno, Anna Fensel, Walter Terkaj, Greta Adamo, Damion M. Dooley, Michaela Kümpel, Georgeta Bordea, Robert Warren, Anoosha Sehar, Matthew Lange, Felix Bindt, Ido Toxopeus, Davide Audrito, Francesca Grasso, Roberto Nai, Emilio Sulis, John Beverley, Mark Jensen, Sergio de Cesare, Frederik Gailly, Chris Partridge, Oscar Pastor, Alexander García Castro, Thomas Hubauer, Wolfgang Suess, Philipp Schmurr, Max Willis, Daniele Francesco Santamaria, Thijs van Ede, Dan Klein, Gal Engelberg, Gianpietro Castiglione, Giampaolo Bella, Andrea Continella, Giancarlo Guizzardi, Davide Lanti, Alessandro Mosca, Federico Maria Scafoglieri, Guohui Xiao, Krzysztof Kutt, Jesualdo Tomás Fernández-Breis, Alois Pichler, Gábor Palkó, Grzegorz J. Nalepa, Pawel Garbacz, Robert Pergl, Zubeida Casmod Khan, João Moreira, Adrien Barton, Emilio M. Sanfilippo, Laura Daniele, João Paulo A. Almeida, Enrico Franconi, Paul Johannesson, Chiara Ghidini, Veruska Zamborlini
2024 J jnl
Semantic Web
Bahar Aameri, María Poveda-Villalón, Emilio M. Sanfilippo, Walter Terkaj
2023 C conf
FOIS
Francesco Compagno, Stefano Borgo, Emilio M. Sanfilippo, Walter Terkaj
2022 conf
FOMI
Walter Terkaj, Stefano Borgo, Emilio M. Sanfilippo
2022 ed.
LDAC@ESWC
Pieter Pauwels, María Poveda-Villalón, Walter Terkaj
2021 conf
JOWO
Stefano Borgo, Emilio M. Sanfilippo, Walter Terkaj
2021 J jnl
Appl. Ontology
Emilio M. Sanfilippo, Walter Terkaj, Stefano Borgo
2021 B conf
DCOSS
Theofanis P. Raptis, Walter Terkaj, Andrea Passarella, Marco Conti
2021 ed.
JOWO
Emilio M. Sanfilippo, Oliver Kutz, Nicolas Troquard, Torsten Hahmann, Claudio Masolo, Robert Hoehndorf, Randi Vita, Maria M. Hedblom, Guendalina Righetti, Dusan Sormaz, Walter Terkaj, Tiago Prince Sales, Sergio de Cesare, Frederik Gailly, Giancarlo Guizzardi, Mark Lycett, Chris Partridge, Oscar Pastor, Daniel Beßler, Stefano Borgo, Mohammed Diab, Aldo Gangemi, Alberto Olivares Alarcos, Mihai Pomarlan, Robert Porzel, Ludger Jansen, Mathias Brochhausen, Daniele Porello, Pawel Garbacz, Selja Seppälä, Michael Grüninger, Amanda Vizedom, Damion M. Dooley, Robert Warren, Hande Küçük-McGinty, Matthew Lange, Alsayed Algergawy, Naouel Karam, Friederike Klan, Franck Michel, Ilaria Rosati
2020 conf
I-ESA Workshops
Dusan Sormaz, Arkopaul Sarkar, Walter Terkaj
2019 conf
SEBD
Loris Roveda, Blerina Spahiu, Walter Terkaj
2019 conf
JOWO
Emilio M. Sanfilippo, Walter Terkaj, Stefano Borgo
2017 conf
JOWO
Walter Terkaj, Pieter Pauwels
2017 C conf
FedCSIS
Walter Terkaj, Marcello Urgo, Daniela Andolfatto
2017 J jnl
Int. J. Comput. Integr. Manuf.
Gianfranco E. Modoni, Michalis Doukas, Walter Terkaj, Marco Sacco, Dimitris Mourtzis
2017 conf
AVR (1)
Vladimir Kuts, Gianfranco E. Modoni, Walter Terkaj, Toivo Tähemaa, Marco Sacco, Tauno Otto
2017 conf
JOWO
Walter Terkaj
2017 conf
JOWO
Walter Terkaj, Georg Ferdinand Schneider, Pieter Pauwels
2017 conf
JOWO
Walter Terkaj, Giovanni Paolo Viganò
2016 conf
PLM
Maxime Lafleur, Walter Terkaj, Farouk Belkadi, Marcello Urgo, Alain Bernard, Marcello Colledani
2016 J jnl
J. Biomed. Semant.
Aleksandra Sojic, Walter Terkaj, Giorgia Contini, Marco Sacco
2015 conf
FOMI
Soumaya El Kadiri, Walter Terkaj, Esmond Neil Urwin, Claire Palmer, Dimitris Kiritsis, Robert I. M. Young
2014 C conf
INDIN
Walter Terkaj, Marcello Urgo
2014 conf
HCI (4)
Marco Sacco, Enrico Giacinto Caldarola, Gianfranco E. Modoni, Walter Terkaj
2014 conf
FOMI@FOIS
Stefano Borgo, Emilio M. Sanfilippo, Aleksandra Sojic, Walter Terkaj
2012 J jnl
J. Simulation
Giulia Pedrielli, Marco Sacco, Walter Terkaj, Tullio Tolio
2011 B conf
PADS
Giulia Pedrielli, Paola Scavardone, Tullio Tolio, Marco Sacco, Walter Terkaj
2011 conf
HCI (14)
Marco Sacco, Giovanni Dal Maso, Ferdinando Milella, Paolo Pedrazzoli, Diego Rovere, Walter Terkaj
2010 J jnl
Int. J. Manuf. Res.
Walter Terkaj, Tullio Tolio, Anna Valente
redb/extractors/elf_extractors/elf_notes.py
← Index redb/extractors/elf_extractors/elf_notes.py python
import inspect
import binascii
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFNote


class ELFNotesExtractor(ELFExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            elf,
        )
        self.elf_notes = []
        self.elastic_index = self.index_prefix + "-elf_notes"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _get_note_type_string(self, note_type: int, note_name: str) -> str:
        """Convert note type number to human-readable string."""

        # GNU-specific note types
        if note_name == "GNU":
            gnu_types = {
                1: "NT_GNU_ABI_TAG",
                2: "NT_GNU_HWCAP",
                3: "NT_GNU_BUILD_ID",
                4: "NT_GNU_GOLD_VERSION",
                5: "NT_GNU_PROPERTY_TYPE_0"
            }
            return gnu_types.get(note_type, f"NT_GNU_UNKNOWN_{note_type}")

        # Generic note types
        generic_types = {
            1: "NT_PRSTATUS",
            2: "NT_FPREGSET",
            3: "NT_PRPSINFO",
            4: "NT_TASKSTRUCT",
            5: "NT_AUXV",
            6: "NT_PSTATUS",
            7: "NT_FPREGS",
            8: "NT_PSINFO",
            9: "NT_PRCRED",
            10: "NT_UTSNAME",
            11: "NT_LWPSTATUS",
            12: "NT_LWPSINFO",
            13: "NT_PRFPXREG"
        }

        return generic_types.get(note_type, f"NT_UNKNOWN_{note_type}")

    def _format_note_description(self, note_desc, note_type: int, note_name: str) -> str:
        """Format note description based on type for human readability."""
        try:
            if not note_desc:
                return ""

            # Handle build ID specifically (common case)
            if note_name == "GNU" and note_type == 3:  # NT_GNU_BUILD_ID
                if isinstance(note_desc, bytes):
                    return binascii.hexlify(note_desc).decode('ascii')
                return str(note_desc)

            # Handle ABI tag
            if note_name == "GNU" and note_type == 1:  # NT_GNU_ABI_TAG
                if isinstance(note_desc, bytes) and len(note_desc) >= 16:
                    # ABI tag contains OS, major, minor, subminor
                    import struct
                    try:
                        os_val, major, minor, subminor = struct.unpack('<IIII', note_desc[:16])
                        os_names = {0: "Linux", 1: "GNU", 2: "Solaris", 3: "FreeBSD"}
                        os_name = os_names.get(os_val, f"OS_{os_val}")
                        return f"{os_name} {major}.{minor}.{subminor}"
                    except:
                        pass

            # For binary data, convert to hex
            if isinstance(note_desc, bytes):
                # Limit size for very large descriptions
                if len(note_desc) > 256:
                    return binascii.hexlify(note_desc[:256]).decode('ascii') + "..."
                return binascii.hexlify(note_desc).decode('ascii')

            # For string data
            if isinstance(note_desc, str):
                return note_desc

            # Fallback
            return str(note_desc)

        except Exception as e:
            self.log.error(f"Error formatting note description: {e}")
            return str(note_desc) if note_desc else ""

    def _extract_note_data(self, note, section_name: str) -> ELFNote:
        """Extract data from a single note entry."""
        try:
            # Get note properties
            note_name = note.get('n_name', '').rstrip('\x00') if note.get('n_name') else ""
            note_type_raw = note.get('n_type', 0)
            note_desc_raw = note.get('n_desc', b'')

            # Handle note_type - pyelftools may return string or int
            if isinstance(note_type_raw, str):
                # pyelftools returned the type as a string like 'NT_GNU_BUILD_ID'
                note_type_str = note_type_raw
                # Map known string types to integers
                note_type_map = {
                    'NT_GNU_ABI_TAG': 1,
                    'NT_GNU_HWCAP': 2,
                    'NT_GNU_BUILD_ID': 3,
                    'NT_GNU_GOLD_VERSION': 4,
                    'NT_GNU_PROPERTY_TYPE_0': 5,
                    'NT_PRSTATUS': 1,
                    'NT_FPREGSET': 2,
                    'NT_PRPSINFO': 3,
                    'NT_TASKSTRUCT': 4,
                    'NT_AUXV': 5,
                    'NT_PSTATUS': 6,
                    'NT_FPREGS': 7,
                    'NT_PSINFO': 8,
                    'NT_PRCRED': 9,
                    'NT_UTSNAME': 10,
                    'NT_LWPSTATUS': 11,
                    'NT_LWPSINFO': 12,
                    'NT_PRFPXREG': 13,
                }
                note_type = note_type_map.get(note_type_raw, 0)
            else:
                note_type = note_type_raw
                # Get human-readable type string
                note_type_str = self._get_note_type_string(note_type, note_name)

            # Format description
            note_desc = self._format_note_description(note_desc_raw, note_type, note_name)

            return ELFNote(
                note_name=note_name,
                note_type=note_type,
                note_type_str=note_type_str,
                note_desc=note_desc,
                note_section=section_name
            )

        except Exception as e:
            self.log.error(f"Error extracting note data: {e}")
            return None

    def _extract_notes_from_sections(self, elf) -> List[Dict]:
        """Extract notes from note sections."""
        notes = []

        try:
            # Look for note sections
            for section in elf.iter_sections():
                if (section.name and
                    section.name.startswith('.note') and
                    hasattr(section, 'iter_notes')):

                    section_name = section.name
                    try:
                        for note in section.iter_notes():
                            note_data = self._extract_note_data(note, section_name)
                            if note_data:
                                notes.append(note_data)
                    except Exception as e:
                        self.log.debug(f"Could not process notes in section {section_name}: {e}")

        except Exception as e:
            self.log.error(f"Error extracting notes from sections: {e}")

        return notes

    def _extract_notes_from_segments(self, elf) -> List[Dict]:
        """Extract notes from PT_NOTE segments."""
        notes = []

        try:
            # Look for PT_NOTE segments
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_NOTE':
                    segment_name = f"PT_NOTE_segment_{segment.header.get('p_offset', 0)}"

                    try:
                        if hasattr(segment, 'iter_notes'):
                            for note in segment.iter_notes():
                                note_data = self._extract_note_data(note, segment_name)
                                if note_data:
                                    notes.append(note_data)
                    except Exception as e:
                        self.log.debug(f"Could not process notes in segment: {e}")

        except Exception as e:
            self.log.error(f"Error extracting notes from segments: {e}")

        return notes

    def tag(self):
        return Tag.ELF_NOTES.value if hasattr(Tag, 'ELF_NOTES') else "elf_notes"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                all_notes = []

                # Extract notes from note sections
                section_notes = self._extract_notes_from_sections(elf)
                all_notes.extend(section_notes)

                # Extract notes from PT_NOTE segments
                segment_notes = self._extract_notes_from_segments(elf)
                all_notes.extend(segment_notes)

                # Remove duplicates (same note might appear in section and segment)
                unique_notes = []
                seen_notes = set()
                for note in all_notes:
                    note_key = (note.note_name, note.note_type, note.note_desc)
                    if note_key not in seen_notes:
                        seen_notes.add(note_key)
                        unique_notes.append(note)

                return unique_notes

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_notes = result
            return self.elf_notes

        except Exception as e:
            self.log.error(f"Error extracting ELF notes {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_notes
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no notes found
                # None is reserved for actual errors

                # Prepare data arrays for all notes
                data = []
                current_time = datetime.now(timezone.utc)
                for note in self.elf_notes:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        note.note_name,
                        note.note_type,
                        note.note_type_str,
                        note.note_desc,
                        note.note_section,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'note_name', 'note_type', 'note_type_str',
                    'note_desc', 'note_section',
                    'analysis_date'
                ]

                if not data:
                    return None

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt32', 'LowCardinality(String)',
                    'String CODEC(ZSTD(3))', 'LowCardinality(String)',
                    'DateTime64(3, \'UTC\')'
                ]

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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