Maciej Obremski

81 papers A* 4A 4B 3Journal 53Unranked 17
YearRankTypeTitle / Venue / Authors
2026 J jnl
Electron. Colloquium Comput. Complex.
Divesh Aggarwal, Zihan Li, Saswata Mukherjee, Maciej Obremski, João Ribeiro
2026 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Zihan Li, Saswata Mukherjee, Maciej Obremski, João Ribeiro
2025 conf
CRYPTO (1)
Divesh Aggarwal, Pranjal Dutta, Saswata Mukherjee, Satyajeet Nagargoje, Maciej Obremski
2025 J jnl
Electron. Colloquium Comput. Complex.
Divesh Aggarwal, Pranjal Dutta, Saswata Mukherjee, Satyajeet Nagargoje, Maciej Obremski
2025 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Pranjal Dutta, Saswata Mukherjee, Satyajeet Nagargoje, Maciej Obremski
2025 A conf
ITCS
Divesh Aggarwal, Pranjal Dutta, Zeyong Li, Maciej Obremski, Sidhant Saraogi
2025 J jnl
CoRR
Divesh Aggarwal, Tomasz Kazana, Maciej Obremski
2025 J jnl
IACR Cryptol. ePrint Arch.
Nico Döttling, Jesko Dujmovic, Julian Loss, Maciej Obremski
2025 conf
TCC (4)
Damiano Abram, Serge Fehr, Maciej Obremski, Peter Scholl
2025 J jnl
IACR Cryptol. ePrint Arch.
Damiano Abram, Serge Fehr, Maciej Obremski, Peter Scholl
2024 J jnl
CoRR
Mate Soos, Uddalok Sarkar, Divesh Aggarwal, Sourav Chakraborty, Kuldeep S. Meel, Maciej Obremski
2024 J jnl
Electron. Colloquium Comput. Complex.
Divesh Aggarwal, Pranjal Dutta, Zeyong Li, Maciej Obremski, Sidhant Saraogi
2024 conf
CRYPTO (6)
Maciej Obremski, João Ribeiro, Lawrence Roy, François-Xavier Standaert, Daniele Venturi
2024 J jnl
IACR Cryptol. ePrint Arch.
Maciej Obremski, João Ribeiro, Lawrence Roy, François-Xavier Standaert, Daniele Venturi
2024 A conf
ESA
Nils Fleischhacker, Kasper Green Larsen, Maciej Obremski, Mark Simkin
2024 J jnl
IEEE Trans. Inf. Theory
Divesh Aggarwal, Naresh Goud Boddu, Rahul Jain, Maciej Obremski
2023 J jnl
Algorithmica
Divesh Aggarwal, Nico Döttling, Jesko Dujmovic, Mohammad Hajiabadi, Giulio Malavolta, Maciej Obremski
2023 A conf
ITC
Kasper Green Larsen, Maciej Obremski, Mark Simkin
2023 A* conf
IJCAI
Mate Soos, Divesh Aggarwal, Sourav Chakraborty, Kuldeep S. Meel, Maciej Obremski
2023 conf
CRYPTO (2)
Divesh Aggarwal, Eldon Chung, Maciej Obremski
2023 J jnl
CoRR
Nils Fleischhacker, Kasper Green Larsen, Maciej Obremski, Mark Simkin
2023 J jnl
IACR Cryptol. ePrint Arch.
Nils Fleischhacker, Kasper Green Larsen, Maciej Obremski, Mark Simkin
2023 J jnl
IACR Cryptol. ePrint Arch.
Damiano Abram, Maciej Obremski, Peter Scholl
2023 J jnl
Electron. Colloquium Comput. Complex.
Eldon Chung, Alexander Golovnev, Zeyong Li, Maciej Obremski, Sidhant Saraogi, Noah Stephens-Davidowitz
2022 A conf
ITCS
Divesh Aggarwal, Nico Döttling, Jesko Dujmovic, Mohammad Hajiabadi, Giulio Malavolta, Maciej Obremski
2022 J jnl
IACR Cryptol. ePrint Arch.
Kasper Green Larsen, Maciej Obremski, Mark Simkin
2022 J jnl
Entropy
Divesh Aggarwal, Marshall Ball, Maciej Obremski
2022 conf
TCC (1)
Divesh Aggarwal, Eldon Chung, Maciej Obremski, João Ribeiro
2022 J jnl
IEEE Trans. Inf. Theory
Divesh Aggarwal, Maciej Obremski, João Ribeiro, Mark Simkin, Luisa Siniscalchi
2022 conf
CRYPTO (1)
Jesper Buus Nielsen, João Ribeiro, Maciej Obremski
2022 J jnl
IACR Cryptol. ePrint Arch.
Jesper Buus Nielsen, João Ribeiro, Maciej Obremski
2022 A* conf
STOC
Divesh Aggarwal, Bhavana Kanukurthi, Sai Lakshmi Bhavana Obbattu, Maciej Obremski, Sruthi Sekar
2022 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Marshall Ball, Maciej Obremski
2022 J jnl
IEEE Trans. Inf. Theory
Gianluca Brian, Antonio Faonio, Maciej Obremski, João Ribeiro, Mark Simkin, Maciej Skórski, Daniele Venturi
2021 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Nico Döttling, Jesko Dujmovic, Mohammad Hajiabadi, Giulio Malavolta, Maciej Obremski
2021 J jnl
CoRR
Eldon Chung, Maciej Obremski, Divesh Aggarwal
2021 J jnl
Electron. Colloquium Comput. Complex.
Eldon Chung, Maciej Obremski, Divesh Aggarwal
2021 J jnl
IACR Cryptol. ePrint Arch.
Eldon Chung, Maciej Obremski, Divesh Aggarwal
2021 J jnl
Electron. Colloquium Comput. Complex.
Divesh Aggarwal, Eldon Chung, Maciej Obremski, João Ribeiro
2021 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Eldon Chung, Maciej Obremski, João Ribeiro
2021 J jnl
CoRR
Divesh Aggarwal, Naresh Goud Boddu, Rahul Jain, Maciej Obremski
2021 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Bhavana Kanukurthi, Sai Lakshmi Bhavana Obbattu, Maciej Obremski, Sruthi Sekar
2021 J jnl
Electron. Colloquium Comput. Complex.
Divesh Aggarwal, Bhavana Kanukurthi, Sai Lakshmi Bhavana Obbattu, Maciej Obremski, Sruthi Sekar
2021 conf
EUROCRYPT (2)
Gianluca Brian, Antonio Faonio, Maciej Obremski, João Ribeiro, Mark Simkin, Maciej Skórski, Daniele Venturi
2020 A* conf
FOCS
Divesh Aggarwal, Maciej Obremski
2020 B conf
ISIT
Maciej Obremski, Maciej Skorski
2020 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Maciej Obremski, João Ribeiro, Mark Simkin, Luisa Siniscalchi
2020 conf
APPROX-RANDOM
Divesh Aggarwal, Siyao Guo, Maciej Obremski, João Ribeiro, Noah Stephens-Davidowitz
2020 conf
EUROCRYPT (1)
Divesh Aggarwal, Maciej Obremski, João Ribeiro, Luisa Siniscalchi, Ivan Visconti
2020 J jnl
IACR Cryptol. ePrint Arch.
Gianluca Brian, Antonio Faonio, Maciej Obremski, Mark Simkin, Daniele Venturi
2020 conf
CRYPTO (3)
Gianluca Brian, Antonio Faonio, Maciej Obremski, Mark Simkin, Daniele Venturi
2020 J jnl
IACR Cryptol. ePrint Arch.
Gianluca Brian, Antonio Faonio, Maciej Obremski, João Ribeiro, Mark Simkin, Maciej Skórski, Daniele Venturi
2020 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Maciej Obremski, João Ribeiro, Mark Simkin, Luisa Siniscalchi
2019 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Maciej Obremski
2019 J jnl
IACR Cryptol. ePrint Arch.
Maciej Obremski, Maciej Skorski
2019 conf
EUROCRYPT (1)
Divesh Aggarwal, Nico Döttling, Jesper Buus Nielsen, Maciej Obremski, Erick Purwanto
2019 J jnl
Electron. Colloquium Comput. Complex.
Divesh Aggarwal, Siyao Guo, Maciej Obremski, João Ribeiro, Noah Stephens-Davidowitz
2019 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Maciej Obremski, João Ribeiro, Luisa Siniscalchi, Ivan Visconti
2019 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Maciej Obremski
2019 conf
CRYPTO (2)
Divesh Aggarwal, Ivan Damgård, Jesper Buus Nielsen, Maciej Obremski, Erick Purwanto, João Ribeiro, Mark Simkin
2018 conf
TCC (2)
Ivan Damgård, Tomasz Kazana, Maciej Obremski, Varun Raj, Luisa Siniscalchi
2018 J jnl
IACR Cryptol. ePrint Arch.
Ivan Damgård, Tomasz Kazana, Maciej Obremski, Varun Raj, Luisa Siniscalchi
2018 B conf
ISIT
Maciej Obremski, Maciej Skorski
2018 B conf
ISIT
Divesh Aggarwal, Tomasz Kazana, Maciej Obremski
2018 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Tomasz Kazana, Maciej Obremski
2018 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Ivan Damgård, Jesper Buus Nielsen, Maciej Obremski, Erick Purwanto, João Ribeiro, Mark Simkin
2017 conf
TCC (2)
Divesh Aggarwal, Tomasz Kazana, Maciej Obremski
2017 J jnl
Electron. Colloquium Comput. Complex.
Nico Döttling, Jesper Buus Nielsen, Maciej Obremski
2017 J jnl
IACR Cryptol. ePrint Arch.
Nico Döttling, Jesper Buus Nielsen, Maciej Obremski
2017 J jnl
IACR Cryptol. ePrint Arch.
Maciej Obremski, Maciej Skorski
2017 conf
APPROX-RANDOM
Maciej Obremski, Maciej Skorski
2017 J jnl
IACR Cryptol. ePrint Arch.
Maciej Obremski, Maciej Skorski
2015 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Tomasz Kazana, Maciej Obremski
2015 conf
TCC (1)
Divesh Aggarwal, Stefan Dziembowski, Tomasz Kazana, Maciej Obremski
2015 A* conf
STOC
Divesh Aggarwal, Yevgeniy Dodis, Tomasz Kazana, Maciej Obremski
2014 J jnl
Electron. Colloquium Comput. Complex.
Divesh Aggarwal, Stefan Dziembowski, Tomasz Kazana, Maciej Obremski
2014 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Stefan Dziembowski, Tomasz Kazana, Maciej Obremski
2014 J jnl
Electron. Colloquium Comput. Complex.
Divesh Aggarwal, Yevgeniy Dodis, Tomasz Kazana, Maciej Obremski
2014 J jnl
IACR Cryptol. ePrint Arch.
Divesh Aggarwal, Yevgeniy Dodis, Tomasz Kazana, Maciej Obremski
2013 J jnl
IACR Cryptol. ePrint Arch.
Stefan Dziembowski, Tomasz Kazana, Maciej Obremski
2013 conf
CRYPTO (2)
Stefan Dziembowski, Tomasz Kazana, Maciej Obremski
redb/extractors/malcontent.py
← Index redb/extractors/malcontent.py python
import inspect
import json
import subprocess
from typing import Any
from datetime import datetime, timezone

from redb.extractors.enum import Tag
from redb.models.dataclasses import Malcontent
from redb.extractors.extractor import Extractor
from dotenv import load_dotenv
import os

load_dotenv(override=True)


class MalcontentExtractor(Extractor):
    """
    Extractor for malcontent tool from chainguard-dev/malcontent.

    Malcontent discovers supply-chain compromises through context, differential
    analysis, and 14,000+ YARA rules. It analyzes binaries and code to detect
    malicious content and suspicious behavioral patterns.

    Binary can be extracted from Docker image:
        docker cp $(docker create cgr.dev/chainguard/malcontent:latest):/usr/bin/mal /usr/local/bin/mal

    Stores full JSON output for materialized view extraction.
    """

    # Cache version at class level to avoid repeated subprocess calls
    _cached_version = None

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious
        )
        self.malcontent = None

    @classmethod
    def _get_malcontent_version(cls, log) -> str:
        """Get malcontent version, cached at class level."""
        if cls._cached_version is not None:
            return cls._cached_version

        malcontent_path = os.getenv("MALCONTENT_PATH", "/usr/local/bin/mal")
        try:
            result = subprocess.run(
                [malcontent_path, "--version"],
                capture_output=True,
                text=True,
                timeout=10
            )
            version_output = result.stdout.strip()
            if result.returncode == 0 and version_output:
                # Parse "malcontent version v1.21.5" -> "1.21.5"
                if version_output.startswith("malcontent version v"):
                    version_output = version_output[len("malcontent version v"):]
                elif version_output.startswith("malcontent version "):
                    version_output = version_output[len("malcontent version "):]
                cls._cached_version = version_output
            else:
                cls._cached_version = "unknown"
        except Exception as e:
            log.warning(f"Could not get malcontent version: {e}")
            cls._cached_version = "unknown"

        return cls._cached_version

    def _extract_malcontent(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        TIMEOUT = int(os.getenv("MALCONTENT_TIMEOUT", "300"))
        malcontent_path = os.getenv("MALCONTENT_PATH", "/usr/local/bin/mal")

        malcontent_command = [malcontent_path, "analyze", "--format=json", self.filepath]

        import signal

        try:
            process = subprocess.Popen(
                malcontent_command,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
                preexec_fn=os.setsid
            )

            try:
                stdout, stderr = process.communicate(timeout=TIMEOUT)
                if process.returncode != 0:
                    self.log.error(f"Error running malcontent, return code: {process.returncode}, stderr: {stderr}")
                    return {}
            except subprocess.TimeoutExpired:
                self.log.warning(f"The malcontent command timed out after {TIMEOUT} seconds, terminating process group")
                try:
                    os.killpg(process.pid, signal.SIGTERM)
                    try:
                        process.wait(timeout=3)
                    except subprocess.TimeoutExpired:
                        self.log.warning("Process didn't terminate with SIGTERM, sending SIGKILL")
                        os.killpg(process.pid, signal.SIGKILL)
                    process.wait()
                except (ProcessLookupError, OSError) as e:
                    self.log.warning(f"Error while killing process: {e}")
                return {}

            try:
                malcontent_output = json.loads(stdout)
            except json.JSONDecodeError as e:
                self.log.error(f"Error parsing malcontent output: {e}")
                return {}

            # Unwrap the Files/<path> structure to get the inner content
            # Structure is: {"Files": {"/path/to/file": {<actual content>}}}
            files_dict = malcontent_output.get("Files", {})
            if not files_dict:
                self.log.warning("Malcontent output has no 'Files' key")
                return {}

            # Get the first (and only) file's content
            file_content = next(iter(files_dict.values()), {})
            if not file_content:
                self.log.warning("Malcontent output has empty file content")
                return {}

            # Extract risk score and level from the unwrapped content
            risk_score = file_content.get("RiskScore", 0)
            risk_level = file_content.get("RiskLevel", "")

            version = self._get_malcontent_version(self.log)

            self.malcontent = Malcontent(
                malcontent_dump=json.dumps(file_content),
                version=version,
                risk_score=risk_score,
                risk_level=risk_level
            )
            self.log.debug(f"Malcontent analysis complete, version={version}, risk={risk_level}({risk_score})")

        except Exception as e:
            self.log.error(f"Unexpected error in malcontent extraction: {str(e)}")
            if 'process' in locals() and process.poll() is None:
                try:
                    os.killpg(process.pid, signal.SIGKILL)
                    process.wait()
                except:
                    pass
            return {}

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            current_time = datetime.now(timezone.utc)

            data = [[
                self.sha256,
                current_time,
                self.malcontent.version,
                self.malcontent.risk_score,
                self.malcontent.risk_level,
                self.malcontent.malcontent_dump
            ]]

            column_names = [
                'sha256', 'analysis_date',
                'malcontent_version', 'malcontent_risk_score', 'malcontent_risk_level',
                'malcontent_json'
            ]

            column_type_names = [
                'FixedString(64)',
                'DateTime64(3, \'UTC\')',
                'LowCardinality(String)', 'UInt8', 'LowCardinality(String)',
                'JSON'
            ]

            return (data, column_names, column_type_names)

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

    def extract(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            self._extract_malcontent()
            return self.malcontent
        except Exception as e:
            self.log.error(f"Error extracting malcontent: {e}")
            return None

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