Ilya Sergey

96 papers A* 9A 13B 8C 5Journal 51Unranked 9
YearRankTypeTitle / Venue / Authors
2026 J jnl
Proc. ACM Program. Lang.
Vladimir Gladshtein, George Pîrlea, Qiyuan Zhao, Vitaly Kurin, Ilya Sergey
2026 J jnl
CoRR
Yunjeong Lee, Gokul Rajiv, Ilya Sergey
2025 conf
CAV (3)
Kiran Gopinathan, Dionysios Spiliopoulos, Vikram Goyal, Peter Müller, Markus Püschel, Ilya Sergey
2025 J jnl
CoRR
Tasos Kichidis, Lefteris Kokoris-Kogias, Arun Koshy, Ilya Sergey, Alberto Sonnino, Mingwei Tian, Jianting Zhang
2025 B conf
ICLP
Ziyi Yang, George Pîrlea, Ilya Sergey
2025 J jnl
CoRR
Ziyi Yang, Ilya Sergey
2025 J jnl
Proc. ACM Program. Lang.
Ziyi Yang, Ilya Sergey
2025 A* conf
USENIX Security Symposium
Yuxi Ling, Gokul Rajiv, Kiran Gopinathan, Ilya Sergey
2025 conf
CAV (3)
George Pîrlea, Vladimir Gladshtein, Elad Kinsbruner, Qiyuan Zhao, Ilya Sergey
2024 A* conf
CCS
Qiyuan Zhao, George Pîrlea, Karolina Grzeszkiewicz, Seth Gilbert, Ilya Sergey
2024 J jnl
CoRR
Callista Le, Kiran Gopinathan, Koon Wen Lee, Seth Gilbert, Ilya Sergey
2024 J jnl
Proc. ACM Program. Lang.
Callista Le, Kiran Gopinathan, Koon Wen Lee, Seth Gilbert, Ilya Sergey
2024 B conf
SLE
Yunjeong Lee, Kiran Gopinathan, Ziyi Yang, Matthew Flatt, Ilya Sergey
2024 J jnl
Dagstuhl Artifacts Ser.
David Young, Ziyi Yang, Ilya Sergey, Alex Potanin
2024 J jnl
CoRR
David Young, Ziyi Yang, Ilya Sergey, Alex Potanin
2024 A conf
ECOOP
David Young, Ziyi Yang, Ilya Sergey, Alex Potanin
2024 J jnl
Proc. ACM Program. Lang.
Vladimir Gladshtein, Qiyuan Zhao, Willow Ahrens, Saman P. Amarasinghe, Ilya Sergey
2024 J jnl
CoRR
Vladimir Gladshtein, Qiyuan Zhao, Willow Ahrens, Saman P. Amarasinghe, Ilya Sergey
2024 B conf
CPP
Qiyuan Zhao, George Pîrlea, Zhendong Ang, Umang Mathur, Ilya Sergey
2024 J jnl
CoRR
Vladimir Gladshtein, George Pîrlea, Ilya Sergey
2023 J jnl
Proc. ACM Program. Lang.
Sewen Thy, Andreea Costea, Kiran Gopinathan, Ilya Sergey
2023 J jnl
CoRR
Ruijie Meng, George Pîrlea, Abhik Roychoudhury, Ilya Sergey
2023 A* conf
CCS
Ruijie Meng, George Pîrlea, Abhik Roychoudhury, Ilya Sergey
2023 J jnl
ACM Trans. Softw. Eng. Methodol.
Andreea Costea, Abhishek Tiwari, Sigmund Chianasta, Kishore R, Abhik Roychoudhury, Ilya Sergey
2023 J jnl
Proc. ACM Program. Lang.
Jonás Fiala, Shachar Itzhaky, Peter Müller, Nadia Polikarpova, Ilya Sergey
2023 J jnl
Proc. ACM Program. Lang.
Kiran Gopinathan, Mayank Keoliya, Ilya Sergey
2023 C ed.
PADL
Martin Gebser, Ilya Sergey
2023 J jnl
Dagstuhl Reports
Swen Jacobs, Kenneth L. McMillan, Roopsha Samanta, Ilya Sergey
2022 B ed.
APLAS
Ilya Sergey
2022 A ed.
ESOP
Ilya Sergey
2022 J jnl
Proc. ACM Program. Lang.
Tram Hoang, Anton Trunov, Leonidas Lampropoulos, Ilya Sergey
2021 B conf
VMCAI
Thanh-Toan Nguyen, Quang-Trung Ta, Ilya Sergey, Wei-Ngan Chin
2021 J jnl
Proc. ACM Program. Lang.
Yasunari Watanabe, Kiran Gopinathan, George Pîrlea, Nadia Polikarpova, Ilya Sergey
2021 A* conf
PLDI
Shachar Itzhaky, Hila Peleg, Nadia Polikarpova, Reuben N. S. Rowe, Ilya Sergey
2021 conf
CAV (1)
Shachar Itzhaky, Hila Peleg, Nadia Polikarpova, Reuben N. S. Rowe, Ilya Sergey
2021 J jnl
CoRR
Andreea Costea, Abhishek Tiwari, Sigmund Chianasta, Kishore R, Abhik Roychoudhury, Ilya Sergey
2021 A* conf
PLDI
George Pîrlea, Amrit Kumar, Ilya Sergey
2021 J jnl
J. Funct. Program.
Kristoffer Just Arndal Andersen, Ilya Sergey
2020 J jnl
CoRR
Kiran Gopinathan, Ilya Sergey
2020 conf
CAV (2)
Kiran Gopinathan, Ilya Sergey
2020 J jnl
CoRR
Vaivaswatha Nagaraj, Jacob Johannsen, Anton Trunov, George Pîrlea, Amrit Kumar, Ilya Sergey
2020 J jnl
CoRR
Andreea Costea, Amy Zhu, Nadia Polikarpova, Ilya Sergey
2020 A conf
ESOP
Andreea Costea, Amy Zhu, Nadia Polikarpova, Ilya Sergey
2020 J jnl
CoRR
Talia Ringer, Karl Palmskog, Ilya Sergey, Milos Gligoric, Zachary Tatlock
2019 J jnl
Proc. ACM Program. Lang.
Nikos Gorogiannis, Peter W. O'Hearn, Ilya Sergey
2019 C conf
PADL
Kristoffer Just Arndal Andersen, Ilya Sergey
2019 A* conf
PODC
Ilya Sergey
2019 A conf
ISSTA
Aashish Kolluri, Ivica Nikolic, Ilya Sergey, Aquinas Hobor, Prateek Saxena
2019 J jnl
Found. Trends Program. Lang.
Talia Ringer, Karl Palmskog, Ilya Sergey, Milos Gligoric, Zachary Tatlock
2019 C conf
VECoS
Elvira Albert, Pablo Gordillo, Albert Rubio, Ilya Sergey
2019 J jnl
Proc. ACM Program. Lang.
Ilya Sergey, Vaivaswatha Nagaraj, Jacob Johannsen, Amrit Kumar, Anton Trunov, Ken Chan Guan Hao
2019 J jnl
Proc. ACM Program. Lang.
Nadia Polikarpova, Ilya Sergey
2018 J jnl
CoRR
Nikos Gorogiannis, Peter W. O'Hearn, Ilya Sergey
2018 B conf
ATVA
Elvira Albert, Pablo Gordillo, Benjamin Livshits, Albert Rubio, Ilya Sergey
2018 J jnl
CoRR
Elvira Albert, Pablo Gordillo, Benjamin Livshits, Albert Rubio, Ilya Sergey
2018 J jnl
CoRR
Aashish Kolluri, Ivica Nikolic, Ilya Sergey, Aquinas Hobor, Prateek Saxena
2018 A conf
ACSAC
Ivica Nikolic, Aashish Kolluri, Ilya Sergey, Prateek Saxena, Aquinas Hobor
2018 J jnl
CoRR
Ivica Nikolic, Aashish Kolluri, Ilya Sergey, Prateek Saxena, Aquinas Hobor
2018 J jnl
CoRR
Elvira Albert, Pablo Gordillo, Albert Rubio, Ilya Sergey
2018 B conf
CPP
George Pîrlea, Ilya Sergey
2018 J jnl
CoRR
Álvaro García-Pérez, Alexey Gotsman, Yuri Meshman, Ilya Sergey
2018 A conf
ESOP
Álvaro García-Pérez, Alexey Gotsman, Yuri Meshman, Ilya Sergey
2018 J jnl
Proc. ACM Program. Lang.
Ilya Sergey, James R. Wilcox, Zachary Tatlock
2018 J jnl
Proc. ACM Program. Lang.
Sam Blackshear, Nikos Gorogiannis, Peter W. O'Hearn, Ilya Sergey
2018 J jnl
CoRR
Ilya Sergey, Amrit Kumar, Aquinas Hobor
2018 J jnl
CoRR
Nadia Polikarpova, Ilya Sergey
2018 conf
ISoLA (4)
Ilya Sergey, Amrit Kumar, Aquinas Hobor
2017 conf
Financial Cryptography Workshops
Ilya Sergey, Aquinas Hobor
2017 J jnl
CoRR
Ilya Sergey, Aquinas Hobor
2017 J jnl
Dagstuhl Artifacts Ser.
Germán Andrés Delbianco, Ilya Sergey, Aleksandar Nanevski, Anindya Banerjee
2017 A conf
ECOOP
Germán Andrés Delbianco, Ilya Sergey, Aleksandar Nanevski, Anindya Banerjee
2017 J jnl
J. Funct. Program.
Ilya Sergey, Dimitrios Vytiniotis, Simon L. Peyton Jones, Joachim Breitner
2017 conf
SNAPL
James R. Wilcox, Ilya Sergey, Zachary Tatlock
2016 J jnl
CoRR
Germán Andrés Delbianco, Ilya Sergey, Aleksandar Nanevski, Anindya Banerjee
2016 A conf
ICFP
Ilya Sergey
2016 A conf
OOPSLA
Ilya Sergey, Aleksandar Nanevski, Anindya Banerjee, Germán Andrés Delbianco
2016 J jnl
CoRR
Anton Podkopaev, Ilya Sergey, Aleksandar Nanevski
2015 J jnl
CoRR
Ilya Sergey, Aleksandar Nanevski, Anindya Banerjee, Germán Andrés Delbianco
2015 A* conf
PLDI
Ilya Sergey, Aleksandar Nanevski, Anindya Banerjee
2015 A conf
ESOP
Ilya Sergey, Aleksandar Nanevski, Anindya Banerjee
2014 A conf
ESOP
Aleksandar Nanevski, Ruy Ley-Wild, Ilya Sergey, Germán Andrés Delbianco
2014 C conf
PEPM
Álvaro García-Pérez, Pablo Nogueira, Ilya Sergey
2014 A* conf
POPL
Ilya Sergey, Dimitrios Vytiniotis, Simon L. Peyton Jones
2014 J jnl
CoRR
Dionna Amalie Glaze, Ilya Sergey, Christopher Earl, Matthew Might, David Van Horn
2014 J jnl
J. Funct. Program.
Dionna Amalie Glaze, Ilya Sergey, Christopher Earl, Matthew Might, David Van Horn
2014 J jnl
CoRR
Ilya Sergey, Aleksandar Nanevski, Anindya Banerjee
2013 C conf
PEPM
Dominique Devriese, Ilya Sergey, Dave Clarke, Frank Piessens
2013 A* conf
PLDI
Ilya Sergey, Dominique Devriese, Matthew Might, Jan Midtgaard, David Darais, Dave Clarke, Frank Piessens
2013 ch.
Aliasing in Object-Oriented Programming
Dave Clarke, Johan Östlund, Ilya Sergey, Tobias Wrigstad
2012 J jnl
Inf. Process. Lett.
Ilya Sergey, Dave Clarke
2012 B conf
MPC
Ilya Sergey, Jan Midtgaard, Dave Clarke
2012 A conf
ESOP
Ilya Sergey, Dave Clarke
2012 J jnl
CoRR
Christopher Earl, Ilya Sergey, Matthew Might, David Van Horn
2012 A conf
ICFP
Christopher Earl, Ilya Sergey, Matthew Might, David Van Horn
2011 conf
LDTA
Ilya Sergey, Dave Clarke
2009 conf
COP@ECOOP
Dave Clarke, Ilya Sergey
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