Kaitao Meng

82 papers B 5Journal 64Unranked 13
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Wirel. Commun.
Kaitao Meng, Qingqing Wu, Wen Chen
2026 J jnl
IEEE Trans. Wirel. Commun.
Boyi Tang, Hao Xu, Kai-Kit Wong, Kaitao Meng, Ross D. Murch, Chan-Byoung Chae, Yangyang Zhang
2026 J jnl
CoRR
Zhentian Zhang, Christos Masouros, Kai-Kit Wong, Jian Dang, Zaichen Zhang, Kaitao Meng, Farshad Rostami Ghadi, Mohammad Javad Ahmadi
2026 J jnl
IEEE Trans. Wirel. Commun.
Kaitao Meng, Kawon Han, Christos Masouros, Lajos Hanzo
2026 J jnl
CoRR
Rui Wang, Kaitao Meng, Deshi Li, Liang Xu
2026 J jnl
IEEE Trans. Wirel. Commun.
Kawon Han, Kaitao Meng, Christos Masouros
2026 J jnl
CoRR
Dianxin Luan, Chengsi Liang, Jie Huang, Zheng Lin, Kaitao Meng, John Thompson, Cheng-Xiang Wang
2026 J jnl
IEEE Trans. Wirel. Commun.
Kawon Han, Kaitao Meng, Christos Masouros
2025 J jnl
IEEE Internet Things J.
Liang Xu, Kaitao Meng, Deshi Li, Rui Wang, Lele Cong
2025 B conf
WiOpt
Kaitao Meng, Kawon Han, Christos Masouros
2025 J jnl
IEEE Wirel. Commun.
Kaitao Meng, Christos Masouros, Athina P. Petropulu, Lajos Hanzo
2025 J jnl
IEEE Trans. Wirel. Commun.
Kaitao Meng, Christos Masouros, Athina P. Petropulu, Lajos Hanzo
2025 B conf
WCNC
Kaitao Meng, Kawon Han, Christos Masouros, Lajos Hanzo
2025 J jnl
CoRR
Kaitao Meng, Kawon Han, Christos Masouros, Lajos Hanzo
2025 J jnl
IEEE Netw.
Kaitao Meng, Christos Masouros, Kai-Kit Wong, Athina P. Petropulu, Lajos Hanzo
2025 J jnl
IEEE Trans. Veh. Technol.
Guangji Chen, Jun Li, Qingqing Wu, Meng Hua, Kaitao Meng, Zhonghao Lyu
2025 J jnl
IEEE Trans. Veh. Technol.
Jiaming Hu, Kawon Han, Lai Jiang, Kaitao Meng, Fan Liu, Christos Masouros
2025 B conf
WCNC
Rui Wang, Kaitao Meng, Deshi Li
2025 J jnl
IEEE Internet Things J.
Lele Cong, Kaitao Meng, Deshi Li, Hao Jiang, Liang Xu
2025 J jnl
IEEE Trans. Wirel. Commun.
Kaitao Meng, Kawon Han, Christos Masouros, Lajos Hanzo
2025 J jnl
IEEE Trans. Wirel. Commun.
Yihang Jiang, Xiaoyang Li, Guangxu Zhu, Kaifeng Han, Kaitao Meng, Wu Yang, Chenji Liu, Qingjiang Shi, Rui Zhang
2025 conf
SPAWC
Boyi Tang, Hao Xu, Kai-Kit Wong, Kaitao Meng, Ross D. Murch, Chan-Byoung Chae, Yangyang Zhang
2025 J jnl
CoRR
Xusheng Zhu, Farshad Rostami Ghadi, Tuo Wu, Kaitao Meng, Chao Wang, Gui Zhou
2025 J jnl
IEEE Internet Things J.
Wei Huang, Pengfei Wu, Tianhe Xu, Hao Zhang, Kaitao Meng
2025 J jnl
CoRR
Kawon Han, Kaitao Meng, Christos Masouros
2025 J jnl
IEEE Trans. Commun.
Rui Wang, Deshi Li, Qingqing Wu, Kaitao Meng, Boning Feng, Lele Cong
2025 J jnl
Signal Process.
Jiawen Yuan, Gong Zhang, Kaitao Meng, Henry Leung
2025 conf
SPAWC
Lai Jiang, Kaitao Meng, Christos Masouros
2024 J jnl
IEEE Trans. Wirel. Commun.
Meng Hua, Guangji Chen, Kaitao Meng, Shaodan Ma, Chau Yuen, Hing Cheung So
2024 B conf
WCNC
Kaitao Meng, Christos Masouros, Guangji Chen, Fan Liu
2024 J jnl
CoRR
Kaitao Meng, Christos Masouros, Guangji Chen, Fan Liu
2024 J jnl
IEEE Trans. Commun.
Kaitao Meng, Qingqing Wu, Wen Chen, Deshi Li
2024 J jnl
CoRR
Kaitao Meng, Christos Masouros, Athina P. Petropulu, Lajos Hanzo
2024 conf
SPAWC
Kaitao Meng, Christos Masouros
2024 J jnl
CoRR
Kaitao Meng, Christos Masouros
2024 J jnl
IEEE Trans. Intell. Transp. Syst.
Shuya Zhu, Kaitao Meng, Rui Wang, Deshi Li
2024 conf
GLOBECOM (Workshops)
Lai Jiang, Kaitao Meng, Murat Temiz, Jiaming Hu, Christos Masouros
2024 J jnl
CoRR
Kaitao Meng, Christos Masouros, Kai-Kit Wong, Athina P. Petropulu, Lajos Hanzo
2024 J jnl
CoRR
Guangji Chen, Jun Li, Qingqing Wu, Meng Hua, Kaitao Meng, Zhonghao Lyu
2024 J jnl
IEEE Wirel. Commun.
Kaitao Meng, Qingqing Wu, Christos Masouros, Wen Chen, Deshi Li
2024 conf
ICC Workshops
Shuya Zhu, Deshi Li, Kaitao Meng
2024 J jnl
CoRR
Rui Wang, Kaitao Meng, Deshi Li
2024 J jnl
IEEE Trans. Wirel. Commun.
Kaitao Meng, Christos Masouros, Guangji Chen, Fan Liu
2024 J jnl
CoRR
Kaitao Meng, Kawon Han, Christos Masouros, Lajos Hanzo
2024 conf
CSNDSP
Kaitao Meng, Christos Masouros
2024 conf
ICC Workshops
Rui Wang, Deshi Li, Kaitao Meng
2024 J jnl
IEEE Open J. Commun. Soc.
Abdelhamid Salem, Kaitao Meng, Christos Masouros, Fan Liu, David López-Pérez
2024 B conf
WCNC
Lele Cong, Deshi Li, Kaitao Meng, Shuya Zhu
2024 J jnl
IEEE Trans. Veh. Technol.
Kaitao Meng, Qingqing Wu, Wen Chen, Deshi Li
2024 J jnl
IEEE Wirel. Commun. Lett.
Jiaqi Zou, Hao Xu, Chao Wang, Lvxin Xu, Songlin Sun, Kaitao Meng, Christos Masouros, Kai-Kit Wong
2024 J jnl
CoRR
Chenghong Bian, Kaitao Meng, Huihui Wu, Deniz Gündüz
2024 J jnl
IEEE Wirel. Commun.
Kaitao Meng, Qingqing Wu, Jie Xu, Wen Chen, Zhiyong Feng, Robert Schober, A. Lee Swindlehurst
2024 J jnl
IEEE Commun. Lett.
Yifan Jiang, Qingqing Wu, Wen Chen, Kaitao Meng
2024 J jnl
CoRR
Yifan Jiang, Qingqing Wu, Wen Chen, Kaitao Meng
2023 J jnl
CoRR
Kaitao Meng, Qingqing Wu, Wen Chen, Deshi Li
2023 conf
WCSP
Liang Xu, Deshi Li, Kaitao Meng, Mingliu Liu, Shuya Zhu
2023 J jnl
CoRR
Kaitao Meng, Qingqing Wu, Christos Masouros, Wen Chen, Deshi Li
2023 J jnl
IEEE Commun. Lett.
Kaitao Meng, Qingqing Wu, Wen Chen, Enrico Paolini, Elisabetta Matricardi
2023 conf
ICC
Kaitao Meng, Qingqing Wu, Wen Chen, Deshi Li
2023 J jnl
IEEE Trans. Wirel. Commun.
Kaitao Meng, Xiaofan He, Qingqing Wu, Deshi Li
2023 J jnl
CoRR
Kaitao Meng, Christos Masouros, Guangji Chen, Fan Liu
2023 J jnl
IEEE Trans. Wirel. Commun.
Kaitao Meng, Qingqing Wu, Shaodan Ma, Wen Chen, Kunlun Wang, Jun Li
2023 conf
GLOBECOM (Workshops)
Kaitao Meng, Qingqing Wu, Wen Chen, Deshi Li
2022 J jnl
CoRR
Kaitao Meng, Qingqing Wu, Robert Schober, Wen Chen
2022 J jnl
IEEE Trans. Commun.
Kaitao Meng, Qingqing Wu, Robert Schober, Wen Chen
2022 J jnl
CoRR
Kaitao Meng, Qingqing Wu
2022 J jnl
CoRR
Kaitao Meng, Qingqing Wu, Wen Chen, Deshi Li
2022 J jnl
CoRR
Kaitao Meng, Xiaofan He, Qingqing Wu, Deshi Li
2022 conf
GLOBECOM (Workshops)
Kaitao Meng, Xiaofan He, Qingqing Wu, Deshi Li
2022 J jnl
CoRR
Kaitao Meng, Qingqing Wu, Wen Chen, Deshi Li
2022 conf
ICC Workshops
Kaitao Meng, Qingqing Wu
2022 J jnl
CoRR
Kaitao Meng, Qingqing Wu, Shaodan Ma, Wen Chen, Kunlun Wang, Jun Li
2022 J jnl
CoRR
Kaitao Meng, Qingqing Wu, Shaodan Ma, Wen Chen, Tony Q. S. Quek
2022 J jnl
IEEE Wirel. Commun. Lett.
Kaitao Meng, Qingqing Wu, Shaodan Ma, Wen Chen, Tony Q. S. Quek
2022 J jnl
CoRR
Kaitao Meng, Qingqing Wu, Jie Xu, Wen Chen, Zhiyong Feng
2021 J jnl
Sensors
Yi Cen, Mingliu Liu, Deshi Li, Kaitao Meng, Huihui Xu
2021 J jnl
Ad Hoc Networks
Chan Xu, Deshi Li, Qimei Chen, Mingliu Liu, Kaitao Meng
2021 conf
INFOCOM Workshops
Kaitao Meng, Xiaofan He, Deshi Li, Mingliu Liu, Chan Xu
2021 J jnl
IEEE Trans. Veh. Technol.
Kaitao Meng, Deshi Li, Xiaofan He, Mingliu Liu
2020 J jnl
IEEE Internet Things J.
Mingliu Liu, Deshi Li, Yuanyuan Zeng, Wei Huang, Kaitao Meng, Haole Chen
2020 J jnl
Sensors
Kaitao Meng, Deshi Li, Xiaofan He, Mingliu Liu, Weitao Song
2018 J jnl
IEEE Access
Mingliu Liu, Deshi Li, Qimei Chen, Jixuan Zhou, Kaitao Meng, Song Zhang
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