Madina Mansurova

49 papers B 8C 2Journal 14Unranked 25
YearRankTypeTitle / Venue / Authors
2025 J jnl
Comput.
Raikhan Amanova, Baurzhan Belgibayev, Madina Mansurova, Madina Suleimenova, Gulshat Amirkhanova, Gulnur Tyulepberdinova
2025 B conf
PaCT
Maksat Mustafin, Madina Mansurova, Aida Zhakyp, Aksultan A. Mukhanbet, Yerzhan Kenzhebek, Nurislam Kassymbek
2025 J jnl
J. Imaging
Talshyn Sarsembayeva, Madina Mansurova, Assel Abdildayeva, Stepan Serebryakov
2025 C conf
DATA
Aigerim Mussina, Sanzhar Aubakirov, Paulo Trigo, Madina Mansurova
2025 B conf
IEEE Big Data
Shiyu Wei, Linlin Zhang, Taozhi Wang, Jiaqi Hou, Madina Mansurova, Baurzhan Belgibayev, Kai Zhao
2025 J jnl
J. Imaging
Talshyn Sarsembayeva, Madina Mansurova, Ainash Oshibayeva, Stepan Serebryakov
2025 J jnl
IEEE Access
Mussa Aman, Zhanseit Tuimebayev, Madina Mansurova
2025 J jnl
J. Imaging
Baurzhan Belgibayev, Madina Mansurova, Ganibet Ablay, Talshyn Sarsembayeva, Zere Armankyzy
2025 conf
ACIIDS (1)
Alimzhan Yerkebulan, Madina Mansurova, Assel Abdildayeva, Olzhas Sharip
2025 J jnl
Big Data Cogn. Comput.
Nurgali Kadyrbek, Zhanseit Tuimebayev, Madina Mansurova, Vítor Viegas
2024 conf
IS
Assiya Boltaboyeva, Nurgul Karymssakova, Madina Mansurova, Baglan Imanbek, Bibars Amangeldy, Nurdaulet Tasmurzayev
2024 conf
ICCCI (2)
Talshyn Sarsembayeva, Madina Mansurova, Adrianna Kozierkiewicz, Almagul Kurmanova, Adai Shomanov, Alma Maulenova
2024 conf
ICCCI (CCIS Volume 2)
Madina Mansurova, Baurzhan Belgibayev, Sanzhar Abdrakhim, Assiya Boltaboyeva, Zhanel Baigarayeva, Talshyn Sarsembayeva
2024 conf
IS
Talshyn Sarsembayeva, Madina Mansurova, Magzhan Sarsembayev, Anar Ibrayeva
2024 J jnl
J. Comput. Assist. Learn.
Gulnur Tyulepberdinova, Madina Mansurova, Talshyn Sarsembayeva, Sulu Issabayeva, Darazha N. Issabayeva
2023 J jnl
Algorithms
Gulshat Amirkhanova, Madina Mansurova, Gennadii Ososkov, Nasurlla Burtebayev, Adai Shomanov, Murat Kunelbayev
2023 conf
EUSPN/ICTH
Dinara Zhaisanova, Madina Mansurova
2023 B conf
PaCT
Stepan Vyazigin, Madina Mansurova
2023 conf
ICCCI (CCIS Volume)
Ainur Zhumasheva, Madina Mansurova, Gulshat Amirkhanova, Rollan Alimgazy
2023 conf
ICCCI (CCIS Volume)
Bibars Amangeldy, Nurdaulet Tasmurzayev, Madina Mansurova, Baglan Imanbek, Talshyn Sarsembayeva
2023 J jnl
Future Internet
Yerlan Kistaubayev, Galimkair Mutanov, Madina Mansurova, Zhanna Saxenbayeva, Yassynzhan Shakan
2023 conf
EUSPN/ICTH
Baurzhan Belgibaev, Madina Mansurova, Sanzhar Abdrakhim, Ainur Ormanbekova
2023 J jnl
Big Data Cogn. Comput.
Nurgali Kadyrbek, Madina Mansurova, Adai Shomanov, Gaukhar Makharova
2023 J jnl
Data
Assel Ospan, Madina Mansurova, Vladimir B. Barakhnin, Aliya Nugumanova, Roman Titkov
2022 J jnl
Int. J. Comput. Commun. Control
Nurassyl Zholdas, Madina Mansurova, Octavian Postolache, Maksat Kalimoldayev, Talshyn Sarsembayeva
2022 conf
MeMeA
Nurassyl Zholdas, Madina Mansurova, Magzhan Sarsembayev, Octavian Postolache, Adai Shomanov, Talshyn Sarsembayeva
2022 conf
ACIIDS (Companion)
Yerlan Zaitin, Octavian Postolache, Madina Mansurova
2022 J jnl
Expert Syst. Appl.
Aliya Nugumanova, Darkhan Akhmed-Zaki, Madina Mansurova, Yerzhan Baiburin, Almasbek Maulit
2022 conf
ACIIDS (2)
Talshyn Sarsembayeva, Madina Mansurova, Adai Shomanov, Magzhan Sarsembayev, Symbat Sagyzbayeva, Gassyrbek Rakhimzhanov
2022 conf
DTESI
Ashat Asset, Madina Mansurova, Vadim Zhmud
2022 conf
ACIIDS (Companion)
Madina Mansurova, B. A. Belgibaev, D. S. Zhamangarin, Nurassyl Zholdas
2022 conf
DTESI
Talshyn Sarsembayeva, Adai Shomanov, Magzhan Sarsembayev, Madina Mansurova, Ainur Zhumasheva, Aigerim Zhunussova, Gassyrbek Rakhimzhanov
2021 B conf
ICCCI
Olga N. Dolinina, Vitaly V. Pechenkin, Madina Mansurova, Dana Tolek, Serik Ixsanov
2021 conf
ICCCI (CCIS Volume)
Aliya Nugumanova, Almasbek Maulit, Madina Mansurova, Yerzhan Baiburin
2020 B conf
ICCCI
Darkhan Akhmed-Zaki, Madina Mansurova, Nurgali Kadyrbek, Vladimir B. Barakhnin, Armanbek Misebay
2020 B conf
ICCCI
Darkhan Akhmed-Zaki, Madina Mansurova, Vladimir B. Barakhnin, Marek Kubis, Darya Chikibayeva, Marzhan Kyrgyzbayeva
2019 conf
LCT
Madina Mansurova, Vladimir B. Barakhnin, Gulmira Madiyeva, Nurgali Kadyrbek, Bekzhan Dossanov
2019 conf
ICCCI (2)
Madina Mansurova, Vladimir B. Barakhnin, Yerzhan Khibatkhanuly, Ilya Pastushkov
2017 conf
ICCCI (2)
Madina Mansurova, Gulmira Madiyeva, Sanzhar Aubakirov, Zhantemir Yermekov, Yermek Alimzhanov
2017 B conf
PaCT
Aday Shomanov, Darkhan Akhmed-Zaki, Madina Mansurova
2016 conf
KESW
Aliya Nugumanova, Igor Bessmertny, Yerzhan Baiburin, Madina Mansurova
2016 conf
ICCCI (2)
Yermek Alimzhanov, Madina Mansurova
2016 J jnl
J. Comput. Sci.
Adai Shomanov, Madina Mansurova
2015 conf
DATA (Revised Selected Papers)
Aliya Nugumanova, Madina Mansurova, Ermek Alimzhanov, Dmitry Zyryanov, Kurmash Apayev
2015 conf
Ershov Memorial Conference
Darkhan Akhmed-Zaki, Madina Mansurova, Bazargul Matkerim, Ekateryna Dadykina, Bolatzhan Kumalakov
2015 C conf
DATA
Aliya Nugumanova, Madina Mansurova, Ermek Alimzhanov, Dmitry Zyryanov, Kurmash Apayev
2015 B conf
PaCT
Darkhan Akhmed-Zaki, Madina Mansurova, Timur Imankulov, Bazargul Matkerim, Ekaterina Dadykina
2015 conf
ICSOFT-EA
Madina Mansurova, Darkhan Akhmed-Zaki, Adai Shomanov, Bazargul Matkerim, Ermek Alimzhanov
2014 conf
ICSOFT EA
Madina Mansurova, Darkhan Akhmed-Zaki, Bazargul Matkerim, Bolatzhan Kumalakov
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