Xianjun Jiao

59 papers B 4C 5Misc 3Journal 25Unranked 21
YearRankTypeTitle / Venue / Authors
2026 J jnl
Ad Hoc Networks
Thijs Havinga, Xianjun Jiao, Wei Liu, Baiheng Chen, Robbe Gaeremynck, Ingrid Moerman
2025 B conf
WCNC
Baiheng Chen, Xianjun Jiao, Wei Liu, Thijs Havinga, Ingrid Moerman
2025 conf
WiNTECH
Thijs Havinga, Xianjun Jiao, Wei Liu, Baiheng Chen, Robbe Gaeremynck, Ingrid Moerman
2025 J jnl
CoRR
Thijs Havinga, Xianjun Jiao, Wei Liu, Baiheng Chen, Robbe Gaeremynck, Ingrid Moerman
2025 conf
JC&S
Xianjun Jiao, Thijs Havinga, Wei Liu, Ingrid Moerman
2025 C conf
WFCS
Pablo Avila-Campos, Jetmir Haxhibeqiri, Xianjun Jiao, Ingrid Moerman, Jeroen Hoebeke
2025 J jnl
CoRR
Thijs Havinga, Xianjun Jiao, Wei Liu, Baiheng Chen, Adnan Shahid, Ingrid Moerman
2025 conf
EuCNC/6G Summit
Thijs Havinga, Xianjun Jiao, Wei Liu, Baiheng Chen, Adnan Shahid, Ingrid Moerman
2024 J jnl
Comput. Commun.
Muhammad Aslam, Xianjun Jiao, Wei Liu, Michael T. Mehari, Thijs Havinga, Ingrid Moerman
2024 J jnl
IEEE Commun. Mag.
Jetmir Haxhibeqiri, Xianjun Jiao, Xiaoman Shen, Chun Pan, Xingfeng Jiang, Jeroen Hoebeke, Ingrid Moerman
2024 C conf
WFCS
Jetmir Haxhibeqiri, Xianjun Jiao, Xiaoman Shen, Chun Pan, Xingfeng Jiang, Jeroen Hoebeke, Ingrid Moerman
2024 J jnl
Comput. Commun.
Muhammad Aslam, Xianjun Jiao, Wei Liu, Michael T. Mehari, Thijs Havinga, Ingrid Moerman
2024 conf
INFOCOM (Workshops)
Thijs Havinga, Xianjun Jiao, Wei Liu, Ingrid Moerman
2024 J jnl
Wirel. Networks
Pablo Avila-Campos, Jetmir Haxhibeqiri, Ingrid Moerman, Xianjun Jiao, Jeroen Hoebeke
2024 C conf
ETFA
Pablo Avila-Campos, Jetmir Haxhibeqiri, Xianjun Jiao, Ingrid Moerman, Jeroen Hoebeke
2024 J jnl
J. Mobile Multimedia
Dirk Dahlhaus, Ingrid Moerman, Nour Mansour, Jeroen Hoebeke, Xianjun Jiao, Jetmir Haxhibeqiri, Josef Börcsök
2024 J jnl
IEEE Access
Pablo Avila-Campos, Jetmir Haxhibeqiri, Xianjun Jiao, Ben Van Herbruggen, Ingrid Moerman, Jeroen Hoebeke
2023 Misc conf
FCCM
Thijs Havinga, Xianjun Jiao, Wei Liu, Ingrid Moerman
2023 J jnl
CoRR
Thijs Havinga, Xianjun Jiao, Wei Liu, Ingrid Moerman
2023 J jnl
Comput. Commun.
Thijs Havinga, Xianjun Jiao, Muhammad Aslam, Wei Liu, Ingrid Moerman
2023 conf
WISEC
Mathy Vanhoef, Xianjun Jiao, Wei Liu, Ingrid Moerman
2023 C conf
WFCS
Jetmir Haxhibeqiri, Xianjun Jiao, Pablo Avila-Campos, Ingrid Moerman, Jeroen Hoebeke
2022 J jnl
IEEE Trans. Ind. Informatics
Muhammad Aslam, Wei Liu, Xianjun Jiao, Jetmir Haxhibeqiri, Gilson Miranda, Jeroen Hoebeke, Johann Marquez-Barja, Ingrid Moerman
2022 conf
NoF
Pablo Avila-Campos, Jetmir Haxhibeqiri, Xianjun Jiao, Muhammad Aslam, Gilson Miranda, Ingrid Moerman, Jeroen Hoebeke
2022 J jnl
IEEE Internet Things Mag.
Gilson Miranda, Jetmir Haxhibeqiri, Nina Slamnik-Krijestorac, Xianjun Jiao, Jeroen Hoebeke, Ingrid Moerman, Daniel F. Macedo, Johann M. Márquez-Barja
2022 C conf
WoWMoM
Thijs Havinga, Xianjun Jiao, Muhammad Aslam, Wei Liu, Ingrid Moerman
2022 J jnl
CoRR
Thijs Havinga, Xianjun Jiao, Muhammad Aslam, Wei Liu, Ingrid Moerman
2021 J jnl
Wirel. Pers. Commun.
Jetmir Haxhibeqiri, Xianjun Jiao, Esteban Municio, Johann M. Márquez-Barja, Ingrid Moerman, Jeroen Hoebeke
2021 conf
ICIT
Jetmir Haxhibeqiri, Xianjun Jiao, Muhammad Aslam, Ingrid Moerman, Jeroen Hoebeke
2021 conf
INFOCOM Workshops
Muhammad Aslam, Wei Liu, Xianjun Jiao, Jetmir Haxhibeqiri, Jeroen Hoebeke, Ingrid Moerman, Esteban Municio, Pedro Heleno Isolani, Gilson Miranda, Johann Marquez-Barja
2021 J jnl
CoRR
Xianjun Jiao, Michael T. Mehari, Wei Liu, Muhammad Aslam, Ingrid Moerman
2021 conf
WISEC
Xianjun Jiao, Michael T. Mehari, Wei Liu, Muhammad Aslam, Ingrid Moerman
2020 J jnl
Sensors
Felipe A. P. de Figueiredo, Ruben Mennes, Irfan Jabandzic, Xianjun Jiao, Ingrid Moerman
2020 conf
VTC Spring
Xianjun Jiao, Muhammad Aslam, Wei Liu, Ingrid Moerman
2020 J jnl
IEEE Commun. Mag.
Joao F. Santos, Wei Liu, Xianjun Jiao, Natal V. Neto, Sofie Pollin, Johann M. Márquez-Barja, Ingrid Moerman, Luiz A. DaSilva
2020 J jnl
Wirel. Pers. Commun.
Wei Liu, Joao F. Santos, Jonathan van de Belt, Xianjun Jiao, Ingrid Moerman, Johann Marquez-Barja, Luiz A. DaSilva, Sofie Pollin
2020 conf
VTC Spring
Seyed Ali Hassani, Xianjun Jiao, Ingrid Moerman, Sofie Pollin
2020 conf
VTC Spring
Xianjun Jiao, Wei Liu, Michael T. Mehari, Muhammad Aslam, Ingrid Moerman
2019 J jnl
Comput. Commun.
Jose Mendes, Xianjun Jiao, Andres Garcia-Saavedra, Felipe Huici, Ingrid Moerman
2019 ed.
CROWNCOM
Ingrid Moerman, Johann Marquez-Barja, Adnan Shahid, Wei Liu, Spilios Giannoulis, Xianjun Jiao
2019 conf
DySPAN
Felipe A. P. de Figueiredo, Dragoslav Stojadinovic, Prasanthi Maddala, Ruben Mennes, Irfan Jabandzic, Xianjun Jiao, Ingrid Moerman
2018 conf
RTSI
Felipe A. P. de Figueiredo, Xianjun Jiao, Wei Liu, Irfan Jabandzic, Spilios Giannoulis, Ingrid Moerman
2018 J jnl
IEEE Access
Felipe A. P. de Figueiredo, Xianjun Jiao, Wei Liu, Ruben Mennes, Irfan Jabandzic, Ingrid Moerman
2018 J jnl
IEEE Access
Muhammad Aslam, Xianjun Jiao, Wei Liu, Ingrid Moerman
2018 J jnl
Wirel. Pers. Commun.
Felipe A. P. de Figueiredo, Xianjun Jiao, Wei Liu, Ingrid Moerman
2018 conf
CrownCom
Wei Liu, Joao F. Santos, Xianjun Jiao, Francisco Paisana, Luiz A. DaSilva, Ingrid Moerman
2017 J jnl
IEEE Trans. Wirel. Commun.
Wei Liu, Eli De Poorter, Jeroen Hoebeke, Emmeric Tanghe, Wout Joseph, Pieter Willemen, Michael T. Mehari, Xianjun Jiao, Ingrid Moerman
2017 conf
WiNTECH
Jose Mendes, Xianjun Jiao, Andres Garcia-Saavedra, Felipe Huici, Ingrid Moerman
2017 B conf
EWSN
Tarik Kazaz, Xianjun Jiao, Merima Kulin, Ingrid Moerman
2017 Misc conf
SenSys
Felipe A. P. de Figueiredo, Wei Liu, Xianjun Jiao, Ingrid Moerman
2017 conf
CrownCom
Xianjun Jiao, Ingrid Moerman, Wei Liu, Felipe Augusto Pereira de Figueiredo
2016 J jnl
CoRR
Tarik Kazaz, Xianjun Jiao, Merima Kulin, Ingrid Moerman
2014 Misc conf
ICASSP
Xie Wen, Xianjun Jiao, Pekka Jääskeläinen, Heikki Kultala, Canfeng Chen, Heikki Berg, Zhisong Bie
2013 B conf
IWCMC
Xianjun Jiao, Canfeng Chen, Pekka Jääskeläinen, Vladimír Guzma, Heikki Berg
2013 conf
ICCT
Chengjun Liu, Zhisong Bie, Canfeng Chen, Xianjun Jiao
2013 conf
ICCT
Zhengli Xu, Zhisong Bie, Canfeng Chen, Xianjun Jiao
2013 B conf
IWCMC
Heikki Kultala, Otto Esko, Pekka Jääskeläinen, Vladimír Guzma, Jarmo Takala, Xianjun Jiao, Tommi Zetterman, Heikki Berg
2012 conf
WASA
Xianjun Jiao
2012 conf
ICTC
Yang Li, Zhisong Bie, Jiaru Lin, Xianjun Jiao
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