Ramachandran Raja

49 papers Journal 49
YearRankTypeTitle / Venue / Authors
2025 J jnl
Int. J. Mach. Learn. Cybern.
S. Patrick Nelson, Ramachandran Raja, P. Eswaran, Jehad O. Alzabut, Grienggrai Rajchakit
2024 J jnl
Neural Networks
A. Stephen, R. Karthikeyan, Chandran Sowmiya, Ramachandran Raja, Ravi P. Agarwal
2023 J jnl
Axioms
S. Aadhithiyan, Ramachandran Raja, Jehad O. Alzabut, Grienggrai Rajchakit, Ravi P. Agarwal
2022 J jnl
Math. Comput. Simul.
Joseph Dianavinnarasi, Ramachandran Raja, Jehad O. Alzabut, Jinde Cao, Michal Niezabitowski, Ovidiu Bagdasar
2022 J jnl
Neurocomputing
Anbalagan Pratap, Ramachandran Raja, Ravi P. Agarwal, Jehad O. Alzabut, Michal Niezabitowski, Evren Hincal
2022 J jnl
Neural Process. Lett.
Stephen Arockia Samy, Ramachandran Raja, Jehad O. Alzabut, Quanxin Zhu, Michal Niezabitowski, Ovidiu Bagdasar
2022 J jnl
Math. Comput. Simul.
Sam O'Neill, Ovidiu Bagdasar, Stuart Berry, Nicolae Popovici, Ramachandran Raja
2022 J jnl
Math. Comput. Simul.
Manickam Iswarya, Ramachandran Raja, Jinde Cao, Michal Niezabitowski, Jehad O. Alzabut, Chinnamuniyandi Maharajan
2021 J jnl
Symmetry
Joseph Dianavinnarasi, Ramachandran Raja, Jehad O. Alzabut, Michal Niezabitowski, Ovidiu Bagdasar
2021 J jnl
Neural Process. Lett.
S. Aadhithiyan, Ramachandran Raja, Quanxin Zhu, Jehad O. Alzabut, Michal Niezabitowski, C. P. Lim
2020 J jnl
IMA J. Math. Control. Inf.
B. Sundara Vadivoo, Ramachandran Raja, Jinde Cao, Grienggrai Rajchakit, Aly R. Seadawy
2020 J jnl
Appl. Math. Comput.
Joseph Dianavinnarasi, Yang Cao, Ramachandran Raja, Grienggrai Rajchakit, Chee Peng Lim
2020 J jnl
Neural Process. Lett.
A. Pratap, Ramachandran Raja, Jehad O. Alzabut, Joseph Dianavinnarasi, Jinde Cao, Grienggrai Rajchakit
2020 J jnl
Neurocomputing
Grienggrai Rajchakit, Pharunyou Chanthorn, Michal Niezabitowski, Ramachandran Raja, Dumitru Baleanu, A. Pratap
2020 J jnl
Neural Process. Lett.
A. Pratap, Ramachandran Raja, Ravi P. Agarwal, Jinde Cao, Ovidiu Bagdasar
2020 J jnl
Math. Comput. Simul.
Jinde Cao, Ramachandran Raja, Xiaodi Li
2019 J jnl
Math. Comput. Simul.
S. Vimal Kumar, Selvaraj Marshal Anthoni, Ramachandran Raja
2019 J jnl
Neurocomputing
Chinnamuniyandi Maharajan, Ramachandran Raja, Jinde Cao, Grienggrai Rajchakit
2019 J jnl
J. Frankl. Inst.
Chandran Sowmiya, Ramachandran Raja, Quanxin Zhu, Grienggrai Rajchakit
2019 J jnl
IMA J. Math. Control. Inf.
S. Pandiselvi, Ramachandran Raja, Jinde Cao, Xiaodi Li, Grienggrai Rajchakit
2019 J jnl
Math. Comput. Simul.
K. Balasundaram, Ramachandran Raja, A. Pratap, S. Chandrasekaran
2019 J jnl
Math. Comput. Simul.
B. Sundara Vadivoo, Ramachandran Raja, Aly R. Seadawy, Grienggrai Rajchakit
2019 J jnl
Appl. Math. Comput.
A. Pratap, Ramachandran Raja, Jinde Cao, Chee Peng Lim, Ovidiu Bagdasar
2019 J jnl
J. Frankl. Inst.
A. Pratap, Ramachandran Raja, Jinde Cao, Grienggrai Rajchakit, Habib M. Fardoun
2019 J jnl
Neural Process. Lett.
S. Pandiselvi, Ramachandran Raja, Jinde Cao, Grienggrai Rajchakit
2019 J jnl
Math. Comput. Simul.
Ovidiu Bagdasar, Stuart Berry, Sam O'Neill, Nicolae Popovici, Ramachandran Raja
2018 J jnl
J. Frankl. Inst.
S. Pandiselvi, Ramachandran Raja, Quanxin Zhu, Grienggrai Rajchakit
2018 J jnl
J. Frankl. Inst.
Chandran Sowmiya, Ramachandran Raja, Jinde Cao, Xiaodi Li, Grienggrai Rajchakit
2018 J jnl
Neurocomputing
A. Pratap, Ramachandran Raja, Jinde Cao, Grienggrai Rajchakit, Fuad E. Alsaadi
2018 J jnl
J. Frankl. Inst.
Chinnamuniyandi Maharajan, Ramachandran Raja, Jinde Cao, Grienggrai Rajchakit
2018 J jnl
Appl. Math. Comput.
S. Vimal Kumar, Ramachandran Raja, Selvaraj Marshal Anthoni, Jinde Cao, Zhengwen Tu
2018 J jnl
Neural Networks
A. Pratap, Ramachandran Raja, Chandran Sowmiya, Ovidiu Bagdasar, Jinde Cao, Grienggrai Rajchakit
2017 J jnl
J. Frankl. Inst.
Rajendran Samidurai, S. Senthilraj, Quanxin Zhu, Ramachandran Raja, Wei Hu
2017 J jnl
Circuits Syst. Signal Process.
Ramachandran Raja, Quanxin Zhu, Rajendran Samidurai, S. Senthilraj, Wei Hu
2016 J jnl
Neurocomputing
S. Senthilraj, Ramachandran Raja, Quanxin Zhu, Rajendran Samidurai, Hongwei Zhou
2016 J jnl
Neurocomputing
S. Senthilraj, Ramachandran Raja, Quanxin Zhu, Rajendran Samidurai, Zhangsong Yao
2016 J jnl
Neurocomputing
S. Senthilraj, Ramachandran Raja, Feng Jiang, Quanxin Zhu, Rajendran Samidurai
2016 J jnl
Neurocomputing
S. Senthilraj, Ramachandran Raja, Quanxin Zhu, Rajendran Samidurai, Zhangsong Yao
2016 J jnl
Neurocomputing
K. Balasundaram, Ramachandran Raja, Quanxin Zhu, S. Chandrasekaran, Hongwei Zhou
2016 J jnl
Neurocomputing
Rajendran Samidurai, S. Rajavel, Quanxin Zhu, Ramachandran Raja, Hongwei Zhou
2015 J jnl
Appl. Math. Comput.
Ramachandran Raja, Quanxin Zhu, S. Senthilraj, Rajendran Samidurai
2015 J jnl
Int. J. Mach. Learn. Cybern.
Ramachandran Raja, U. Karthik Raja, Rajendran Samidurai, A. Leelamani
2014 J jnl
Int. J. Mach. Learn. Cybern.
Ramachandran Raja, U. Karthik Raja, Rajendran Samidurai, A. Leelamani
2014 J jnl
Neural Comput. Appl.
Ramachandran Raja, U. Karthik Raja, Rajendran Samidurai, A. Leelamani
2013 J jnl
J. Frankl. Inst.
Ramachandran Raja, U. Karthik Raja, Rajendran Samidurai, A. Leelamani
2013 J jnl
J. Optim. Theory Appl.
Rathinasamy Sakthivel, Ramachandran Raja, Selvaraj Marshal Anthoni
2012 J jnl
J. Frankl. Inst.
Ramachandran Raja, Rajendran Samidurai
2011 J jnl
J. Optim. Theory Appl.
Rathinasamy Sakthivel, Ramachandran Raja, Selvaraj Marshal Anthoni
2011 J jnl
Int. J. Appl. Math. Comput. Sci.
Ramachandran Raja, Rathinasamy Sakthivel, Selvaraj Marshal Anthoni, Hyunsoo Kim
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