Kai Xiong

56 papers A* 2A 1C 5Journal 36Unranked 12
YearRankTypeTitle / Venue / Authors
2026 A* conf
CHI
Yuan Tian, Dazhen Deng, Sen Yang, Huawei Zheng, Bowen Shi, Kai Xiong, Xinjing Yi, Yingcai Wu
2025 conf
CLEF (Working Notes)
Jie Tang, Hua Yang, Kai Xiong, Hanyang Li, Paulo Quaresma, Hongbin Yu, Wenbo Zhang, Mingzhou Song
2025 J jnl
Vis. Informatics
Xiwen Cai, Kai Xiong, Zhongsu Luo, Di Weng, Shuainan Ye, Yingcai Wu
2025 J jnl
Int. J. Comput. Vis.
Zhenyu Wang, Xuemei Xie, Hao Luo, Tao Huang, Weisheng Dong, Kai Xiong, Yongxu Liu, Xuyang Li, Fan Wang, Guangming Shi
2025 conf
ACL (1)
Cilin Yan, Jingyun Wang, Lin Zhang, Ruihui Zhao, Xiaopu Wu, Kai Xiong, Qingsong Liu, Guoliang Kang, Yangyang Kang
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Zhongsu Luo, Kai Xiong, Jiajun Zhu, Ran Chen, Xinhuan Shu, Di Weng, Yingcai Wu
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yongxu Liu, Zhihao Ma, Wenxiang Zhu, Na Li, Chuang Li, Kai Xiong, Zhenyu Wang, Wei Feng, Junzheng Jiang, Yinghui Quan
2025 J jnl
npj Digit. Medicine
Yuchuan Jiang, Yao Du, Kai Xiong, Kuiyuan Huang, Tengzheng Li, Zhangyun Li, Morang Zhang, Xiaoning Gan, Qiang Li, Junjie Liang, Mingrong Cao, Jian Sun, Junfu Wang, Jinzhong Duanmu, Xueqin Li, Zhili Wen, Qunguang Jiang, Xin Yu, Shangxiang Chen
2025 J jnl
IEEE Trans. Vis. Comput. Graph.
Xiwen Cai, Xiaodong Ge, Kai Xiong, Shuainan Ye, Di Weng, Ke Xu, Datong Wei, Jiang Long, Yingcai Wu
2025 J jnl
CoRR
Yuan Tian, Dazhen Deng, Sen Yang, Huawei Zheng, Bowen Shi, Kai Xiong, Xinjing Yi, Yingcai Wu
2025 J jnl
CoRR
Kai Xiong, Yanwei Huang, Rongjunchen Zhang, Kun Chen, Haipang Wu
2025 A* conf
CHI
Kai Xiong, Cynthia A. Huang, Michael Wybrow, Yingcai Wu
2025 J jnl
J. Vis.
Siwei Fu, Junjie Jin, Qi Ma, Zhongsu Luo, Kai Xiong, Yingcai Wu
2024 conf
VTC Spring
Ying Luo, Jun-tao Wu, Min Zeng, Kai Xiong, Hong Jiang
2024 conf
ICANN (6)
Siyu Wu, Kai Xiong, Feiyang Yu, Xiyu Pan, Jianjun Li
2024 J jnl
CoRR
Cilin Yan, Jingyun Wang, Lin Zhang, Ruihui Zhao, Xiaopu Wu, Kai Xiong, Qingsong Liu, Guoliang Kang, Yangyang Kang
2024 J jnl
IEEE Trans. Vis. Comput. Graph.
Kai Xiong, Xinyi Xu, Siwei Fu, Di Weng, Yongheng Wang, Yingcai Wu
2024 J jnl
Sensors
Yao He, Guanghui Zhao, Kai Xiong
2024 J jnl
IEEE Trans. Fuzzy Syst.
Kai Xiong, Yucheng Dong, Quanbo Zha
2023 J jnl
Expert Syst. Appl.
Kai Xiong, Yucheng Dong, Quanbo Zha
2023 J jnl
Int. J. Inf. Technol. Decis. Mak.
Kai Xiong, Yucheng Dong, Zhaoxia Guo, Francisco Chiclana, Enrique Herrera-Viedma
2023 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Kai Xiong, Guanghui Zhao, Guangming Shi
2023 J jnl
IEEE Trans. Vis. Comput. Graph.
Kai Xiong, Zhongsu Luo, Siwei Fu, Yongheng Wang, Mingliang Xu, Yingcai Wu
2023 J jnl
IEEE Trans. Vis. Comput. Graph.
Kai Xiong, Siwei Fu, Guoming Ding, Zhongsu Luo, Rong Yu, Wei Chen, Hujun Bao, Yingcai Wu
2022 J jnl
Int. J. Comput. Intell. Syst.
Kai Xiong, Yucheng Dong, Sihai Zhao
2022 J jnl
Database J. Biol. Databases Curation
Chengyu Wang, Tingting Chen, Yuchen Mu, Xuan Liang, Kai Xiong, Liqiang Ai, Yunyan Gu, Xingxing Fan, Haihai Liang
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Kai Xiong, Guanghui Zhao, Yingbin Wang, Guangming Shi, Shuxuan Chen
2022 J jnl
Digit. Signal Process.
Yingbin Wang, Guanghui Zhao, Kai Xiong, Guangming Shi
2022 J jnl
Remote. Sens.
Bin Deng, Kai Xiong, Zhiyong Huang, Changbo Jiang, Jiang Liu, Wei Luo, Yifei Xiang
2022 J jnl
CoRR
Kai Xiong, Zhongsu Luo, Siwei Fu, Yongheng Wang, Mingliang Xu, Yingcai Wu
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Kai Xiong, Guanghui Zhao, Yingbin Wang, Guangming Shi
2022 J jnl
CoRR
Kai Xiong, Siwei Fu, Guoming Ding, Zhongsu Luo, Rong Yu, Wei Chen, Hujun Bao, Yingcai Wu
2021 A conf
CIKM
Li Wang, Peipei Li, Kai Xiong, Jiashu Zhao, Rui Lin
2021 J jnl
Neurocomputing
Yingbin Wang, Guanghui Zhao, Kai Xiong, Guangming Shi, Yumeng Zhang
2021 J jnl
IEEE Trans. Geosci. Remote. Sens.
Kai Xiong, Guanghui Zhao, Yingbin Wang, Guangming Shi
2020 J jnl
CoRR
Siwei Fu, Kai Xiong, Xiaodong Ge, Siliang Tang, Wei Chen, Yingcai Wu
2019 J jnl
Sensors
Kai Xiong, Guanghui Zhao, Guangming Shi, Yingbin Wang
2019 J jnl
Entropy
Yu-Feng Mao, Yun-Ze Li, Ji-Xiang Wang, Kai Xiong, Jia-Xin Li
2019 J jnl
Entropy
Kai Xiong, Yunhua Li, Yun-Ze Li, Ji-Xiang Wang, Yufeng Mao
2019 J jnl
计算机科学
Haoyu Zhang, Kai Xiong
2018 conf
AIM
Shengnan Wang, Yunhua Li, Yun-Ze Li, Kai Xiong
2018 C conf
ICARCV
Ke-yan Liu, Weiguo Lin, Yuling Bai, Lijuan Hu, Yunhua Li, Liman Yang, Kai Xiong
2018 C conf
ICARCV
Kai Xiong, Yunhua Li, Yun-Ze Li, Ji-Xiang Wang
2018 C conf
ICARCV
Jiaxing Li, Yunhua Li, Qu Wang, Hao Lu, Kai Xiong
2018 conf
ICEBT
Juan Wang, Kai Xiong
2017 C conf
IECON
Ruipeng Li, Hongzhuan Qiu, Kai Xiong
2016 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Duo A, Wenji Zhao, Xinyuan Qu, Ran Jing, Kai Xiong
2015 conf
ICC
Kai Xiong, Xi Chen, Lei Rao, Xue Liu, Yuan Yao
2012 conf
ICDIP
Guangchun Gao, Cui Zhang, Shengying Zhao, Kai Xiong, Lina Shang
2010 conf
ICEE
Yun-na Wu, Kai Xiong, Yu-Min Wang
2009 C conf
DASC
Hegen Xiong, Kai Xiong, Qiuhua Tang
2008 conf
BMEI (1)
Kai Xiong, Zhen Xiang, Jianhong Ge
2007 J jnl
Autom.
Kai Xiong, H. Y. Zhang, C. W. Chan
2007 conf
FSKD (4)
Dongxiang Jiang, Kai Xiong, Yongshan Ding, Kai Li
2006 conf
ISNN (2)
Kai Li, Dongxiang Jiang, Kai Xiong, Yongshan Ding
2006 J jnl
Autom.
Kai Xiong, H. Y. Zhang, C. W. Chan
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