Wei Cheng

75 papers A* 6A 3B 2Misc 1Journal 28Unranked 34
YearRankTypeTitle / Venue / Authors
2024 J jnl
IEEE/ACM Trans. Netw.
Guijuan Wang, Jiguo Yu, Yifei Zou, Jianxi Fan, Wei Cheng
2024 J jnl
IEEE Trans. Computers
Jiguo Yu, Biwei Yan, Huayi Qi, Shengling Wang, Wei Cheng
2024 conf
WUWNet
Ting Ye, Bo Qin, Wei Cheng, Zheng Peng, Shanshan Song, Junhong Cui
2023 J jnl
IEEE Internet Things J.
Jiguo Yu, Suhui Liu, Minghui Xu, Hechuan Guo, Fangtian Zhong, Wei Cheng
2022 conf
GHTC
Mohammadbagher Fotouhi, Haixun Wang, Payman Arabshahi, Wei Cheng
2022 J jnl
Microprocess. Microsystems
Tongxin Zhu, Xiuzhen Cheng, Wei Cheng, Zhi Tian, Yingshu Li
2021 J jnl
Comput. Intell. Neurosci.
Weidong Zhao, Feng Chen, Hancheng Huang, Dan Li, Wei Cheng
2021 conf
SmartWorld/SCALCOM/UIC/ATC/IOP/SCI
Curby Alexander, Liran Ma, Zhipeng Cai, Wei Cheng
2020 conf
WASA (1)
Ke Xiao, Ziye Geng, Yunhua He, Gang Xu, Chao Wang, Wei Cheng
2020 J jnl
IEEE Trans. Wirel. Commun.
Jiguo Yu, Kan Yu, Dongxiao Yu, Weifeng Lv, Xiuzhen Cheng, Honglong Chen, Wei Cheng
2020 J jnl
IEEE Trans. Netw. Sci. Eng.
Xiuzhen Cheng, Sriram Chellappan, Wei Cheng, Gokhan Sahin
2020 J jnl
Sensors
Weidong Zhao, Hancheng Huang, Dan Li, Feng Chen, Wei Cheng
2020 conf
PerCom Workshops
Ghazaleh Jowkar, Mohammadbagher Fotouhi, Wei Cheng
2019 conf
WASA
Ke Xiao, Chaofei Li, Yunhua He, Chao Wang, Wei Cheng
2019 J jnl
Comput. Networks
Siyao Cheng, Yingshu Li, Zhi Tian, Wei Cheng, Xiuzhen Cheng
2018 A conf
MobiSys
Mohammadbagher Fotouhi, Ruixin Niu, Wei Cheng
2018 J jnl
IEEE Netw.
Wei Cheng, Jiguo Yu, Feng Zhao, Xiuzhen Cheng
2018 conf
WASA
Ji Li, Madhuri Siddula, Xiuzhen Cheng, Wei Cheng, Zhi Tian, Yingshu Li
2018 Misc conf
SEC
Xiaolu Cheng, Baohua Huang, Wei Cheng
2018 ed.
WASA
Sriram Chellappan, Wei Cheng, Wei Li
2017 J jnl
IEEE Internet Things J.
Nicholas Capurso, Tianyi Song, Wei Cheng, Jiguo Yu, Xiuzhen Cheng
2017 conf
WASA
Baohua Huang, Wei Cheng
2017 conf
WUWNet
Wei Cheng, Yu Luo, Zheng Peng, Jun-Hong Cui
2017 conf
IIKI
Baohua Huang, Xiaolu Cheng, Wei Cheng
2017 J jnl
IEEE Internet Things J.
Rong N. Chang, Xiuzhen Cheng, Wei Cheng, Wonjun Lee, Yingshu Li, Jiguo Yu
2017 conf
SmartIoT@SEC
Baohua Huang, Xiaolu Cheng, Wei Cheng
2017 conf
PAC
Baohua Huang, Qi Lyu, Xiaolu Cheng, Wei Cheng
2017 conf
PAC
Ziye Geng, Yunhua He, Tong Niu, Hong Li, Limin Sun, Wei Cheng, Xu Li
2017 J jnl
IEEE Internet Things J.
Bo Mei, Ruinian Li, Wei Cheng, Jiguo Yu, Xiuzhen Cheng
2016 conf
PAMCO@MobiHoc
Baohua Huang, Fengwei Jia, Jiguo Yu, Wei Cheng
2016 J jnl
IEEE Trans. Veh. Technol.
Tao Jing, Xing Wei, Wei Cheng, Mingyang Guan, Liran Ma, Yan Huo, Xiuzhen Cheng
2016 conf
CSE/EUC/DCABES
Tao Jing, Jie Li, Peng Huang, Wei Cheng, Xiaoshuang Xing, Yan Huo
2016 conf
SpaCCS Workshops
Baohua Huang, Jiawei Mo, Qi Lu, Wei Cheng
2016 conf
IIKI
Bo Mei, Xiaolu Cheng, Xiaoshuang Xing, Bowu Zhang, Wei Cheng
2015 conf
IIKI
Xiaolu Cheng, Jessica Lu, Wei Cheng
2015 J jnl
IEEE Trans. Computers
Yuan Le, Liran Ma, Wei Cheng, Xiuzhen Cheng, Biao Chen
2015 J jnl
Comput. Commun.
Wei Zhou, Tao Jing, Wei Cheng, Tao Chen, Yan Huo
2015 conf
Mobidata@MobiHoc
Wei Cheng, Feng Chen, Xiuzhen Cheng
2015 J jnl
EURASIP J. Wirel. Commun. Netw.
Tao Jing, Xuewei Cui, Wei Cheng, Shixiang Zhu, Yan Huo, Xiuzhen Cheng
2015 conf
HotWeb
Bo Mei, Wei Cheng, Xiuzhen Cheng
2015 J jnl
EURASIP J. Wirel. Commun. Netw.
Tao Jing, Fan Zhang, Wei Cheng, Yan Huo, Xiuzhen Cheng
2015 conf
ICCVE
Wei Cheng, Xiaolu Cheng, Dechang Chen
2014 conf
WUWNet
Wei Cheng, Yu Luo, Zheng Peng, Mardi C. Hastings
2014 J jnl
Mob. Networks Appl.
Xiaoshuang Xing, Tao Jing, Wei Cheng, Yan Huo, Xiuzhen Cheng, Taieb Znati
2014 J jnl
IEEE Trans. Mob. Comput.
Xinlei (Oscar) Wang, Wei Cheng, Prasant Mohapatra, Tarek F. Abdelzaher
2014 conf
WASA
Tao Jing, Xuewei Cui, Wei Cheng, Shixiang Zhu, Yan Huo
2014 conf
WASA
Tao Jing, Fan Zhang, Wei Cheng, Yan Huo, Xiuzhen Cheng
2014 J jnl
Pers. Ubiquitous Comput.
Yanfei Lu, Xin Li, Xing Wei, Tao Jing, Wei Cheng, Yan Huo
2014 B conf
SECON
Wei Cheng, Jindan Zhu, Prasant Mohapatra, Jie Wang
2014 conf
ICCVE
Yan Huo, Yumeng Lu, Wei Cheng, Tao Jing
2014 J jnl
IEEE Netw.
Wei Cheng, Shengling Wang, Xiuzhen Cheng
2013 A* conf
INFOCOM
Xinlei (Oscar) Wang, Wei Cheng, Prasant Mohapatra, Tarek F. Abdelzaher
2013 A* conf
INFOCOM
Ningning Cheng, Xinlei (Oscar) Wang, Wei Cheng, Prasant Mohapatra, Aruna Seneviratne
2013 conf
CrownCom
Wei Zhou, Tao Jing, Wei Cheng, Tao Chen, Yan Huo
2013 conf
CrownCom
Tao Jing, Xiaoshuang Xing, Wei Cheng, Yan Huo, Taieb Znati
2013 conf
ICCVE
Tao Jing, Xing Wei, Wei Cheng, Mingyang Guan, Yan Huo
2013 conf
MiSeNet@MobiCom
Bowu Zhang, Wei Cheng, Limin Sun, Xiuzhen Cheng, Taieb Znati, Mznah Al-Rodhaan, Abdullah Al-Dhelaan
2013 A* conf
INFOCOM
Wei Cheng, Kefeng Tan, Victor Omwando, Jindan Zhu, Prasant Mohapatra
2013 conf
CrownCom
Xianfu Chen, Tao Chen, Wei Cheng, Honggang Zhang
2013 J jnl
IEEE Wirel. Commun.
Xiaoshuang Xing, Tao Jing, Wei Cheng, Yan Huo, Xiuzhen Cheng
2013 conf
ICCVE
Tao Jing, Xingni Li, Wei Cheng, Yan Huo, Xiaoshuang Xing
2013 J jnl
IEEE/ACM Trans. Netw.
Wei Cheng, Nan Zhang, Xiuzhen Cheng, Min Song, Dechang Chen
2013 J jnl
IEEE Trans. Inf. Forensics Secur.
Shraboni Jana, Kai Zeng, Wei Cheng, Prasant Mohapatra
2012 A* conf
INFOCOM
Yuan Le, Liran Ma, Wei Cheng, Xiuzhen Cheng, Biao Chen
2012 J jnl
IEEE Trans. Parallel Distributed Syst.
Wei Cheng, Xiuzhen Cheng, Min Song, Biao Chen, Wendy W. Zhao
2012 conf
WASA
Wei Cheng, Dengyuan Wu, Xiuzhen Cheng, Dechang Chen
2011 A conf
ICDCS
Dengyuan Wu, Xiuzhen Cheng, Dechang Chen, Wei Cheng, Biao Chen, Wei Zhao
2011 J jnl
Wirel. Commun. Mob. Comput.
Yingchang Xiang, Kai Xing, Wei Cheng, E. K. Park, Shmuel Rotenstreich
2010 conf
NAS
Wei Cheng, Nan Zhang, Min Song, Dechang Chen, Xicheng Lu, Zexin Lu
2009 J jnl
IEEE Trans. Mob. Comput.
Amin Y. Teymorian, Wei Cheng, Liran Ma, Xiuzhen Cheng, Xicheng Lu, Zexin Lu
2009 A* conf
INFOCOM
Wei Cheng, Xiuzhen Cheng, Taieb Znati, Xicheng Lu, Zexin Lu
2009 conf
ICDCS Workshops
Wei Cheng, Andrew Thaeler, Xiuzhen Cheng, Fang Liu, Xicheng Lu, Zexin Lu
2008 A conf
ICDCS
Kai Xing, Wei Cheng, E. K. Park, Shmuel Rotenstreich
2008 B conf
MobiHoc
Wei Cheng, Kai Xing, Xiuzhen Cheng, Xicheng Lu, Zexin Lu, Jinshu Su, Baosheng Wang, Yujun Liu
2008 A* conf
INFOCOM
Wei Cheng, Amin Y. Teymorian, Liran Ma, Xiuzhen Cheng, Xicheng Lu, Zexin Lu
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