Neena Imam

64 papers B 5C 2Misc 2Journal 14Unranked 37
YearRankTypeTitle / Venue / Authors
2025 J jnl
CoRR
Kun Yang, Neena Imam
2022 conf
SysCon
Neena Imam, Nageswara S. V. Rao, Anees Al-Najjar, Thomas J. Naughton, Seth Hitefield
2021 J jnl
Int. J. Netw. Comput.
Chung-Hsing Hsu, Neena Imam
2021 conf
IPDPS Workshops
Kuldeep R. Kurte, Neena Imam, Ramakrishnan Kannan, S. M. Shamimul Hasan, Srikanth B. Yoginath
2021 conf
MLN
Nageswara S. V. Rao, Anees Al-Najjar, Neena Imam, Zhengchun Liu, Rajkumar Kettimuthu, Ian T. Foster
2021 conf
IPDPS Workshops
S. M. Shamimul Hasan, Neena Imam, Ramakrishnan Kannan, Srikanth B. Yoginath, Kuldeep R. Kurte
2021 J jnl
CoRR
Anees Al-Najjar, Nageswara S. V. Rao, Neena Imam, Thomas J. Naughton, Seth Hitefield, Lawrence Sorrillo, James Kohl, Wael R. Elwasif, Jean-Christophe Bilheux, Hassina Z. Bilheux, Swen Boehm, Jason Kincl
2021 B conf
LCN
Anees Al-Najjar, Nageswara S. V. Rao, Neena Imam, Thomas J. Naughton, Seth Hitefield, Lawrence Sorrillo, James Kohl, Wael R. Elwasif, Jean-Christophe Bilheux, Hassina Z. Bilheux, Swen Boehm, Jason Kincl
2020 J jnl
ACM Trans. Parallel Comput.
Kathleen E. Hamilton, Catherine D. Schuman, Steven R. Young, Ryan S. Bennink, Neena Imam, Travis S. Humble
2020 conf
IPDPS Workshops
Chung-Hsing Hsu, Neena Imam, Akhil Langer, Sreeram Potluri, Chris J. Newburn
2020 conf
IPDPS Workshops
Nicholas Chaimov, Sameer Shende, Allen D. Malony, Neena Imam
2020 B conf
SMC
Thomas J. Naughton, Seth Hitefield, Lawrence Sorrillo, Nageswara S. V. Rao, James Kohl, Wael R. Elwasif, Jean-Christophe Bilheux, Hassina Z. Bilheux, Swen Boehm, Jason Kincl, Satyabrata Sen, Neena Imam
2019 conf
SysCon
Nageswara S. V. Rao, Neena Imam, Swen Boehm
2019 conf
IEEE BigData
S. M. Shamimul Hasan, Drew Schmidt, Ramakrishnan Kannan, Neena Imam
2019 Misc conf
ICDCN
Nageswara S. V. Rao, Neena Imam, Chris Y. T. Ma, Fei He
2019 conf
INDIS@SC
Nageswara S. V. Rao, Neena Imam, Zhengchun Liu, Rajkumar Kettimuthu, Ian T. Foster
2019 C conf
CLUSTER
Feiyi Wang, Sarp Oral, Satyabrata Sen, Neena Imam
2019 conf
MLN
Nageswara S. V. Rao, Neena Imam, Zhengchun Liu, Rajkumar Kettimuthu, Ian T. Foster
2019 conf
MEMSYS
Satyabrata Sen, Neena Imam
2019 conf
ProTools@SC
Sameer Shende, Nicholas Chaimov, Allen D. Malony, Neena Imam
2019 J jnl
Sensors
Ali Passian, Neena Imam
2019 ed.
OpenSHMEM
Swaroop Pophale, Neena Imam, Ferrol Aderholdt, Manjunath Gorentla Venkata
2019 J jnl
Parallel Comput.
Dylan Machovec, Bhavesh Khemka, Nirmal Kumbhare, Sudeep Pasricha, Anthony A. Maciejewski, Howard Jay Siegel, Ali Akoglu, Gregory A. Koenig, Salim Hariri, Cihan Tunc, Michael Wright, Marcia Hilton, Rajendra Rambharos, Christopher Blandin, Farah Fargo, Ahmed Louri, Neena Imam
2018 C conf
ICCE
Charlotte Kotas, Thomas J. Naughton, Neena Imam
2018 conf
OpenSHMEM
Subhadeep Bhattacharya, Shaeke Salman, Manjunath Gorentla Venkata, Harsh Kundnani, Neena Imam, Weikuan Yu
2018 conf
OpenSHMEM
Ching-Hsiang Chu, Sreeram Potluri, Anshuman Goswami, Manjunath Gorentla Venkata, Neena Imam, Chris J. Newburn
2018 conf
IPDPS Workshops
Kathleen E. Hamilton, Catherine D. Schuman, Steven R. Young, Neena Imam, Travis S. Humble
2018 conf
OpenSHMEM
Thomas J. Naughton, Ferrol Aderholdt, Matthew B. Baker, Swaroop Pophale, Manjunath Gorentla Venkata, Neena Imam
2018 conf
OpenSHMEM
Ferrol Aderholdt, Swaroop Pophale, Manjunath Gorentla Venkata, Neena Imam
2018 ed.
OpenSHMEM
Manjunath Gorentla Venkata, Neena Imam, Swaroop Pophale
2018 conf
IPDPS Workshops
Satyabrata Sen, Neena Imam, Chung-Hsing Hsu
2018 B conf
CCGrid
Huansong Fu, Manjunath Gorentla Venkata, Shaeke Salman, Neena Imam, Weikuan Yu
2018 J jnl
ACM J. Emerg. Technol. Comput. Syst.
Kathleen E. Hamilton, Neena Imam, Travis S. Humble
2018 conf
OpenSHMEM
Nicholas Chaimov, Sameer Shende, Allen D. Malony, Manjunath Gorentla Venkata, Neena Imam
2018 conf
SysCon
Nageswara S. V. Rao, Neena Imam, Jesse Hanley, Sarp Oral
2017 conf
OpenSHMEM
Thomas J. Naughton, Lawrence Sorrillo, Adam Simpson, Neena Imam
2017 conf
NCS
Kathleen E. Hamilton, Neena Imam, Travis S. Humble
2017 J jnl
CoRR
Kathleen E. Hamilton, Neena Imam, Travis S. Humble
2017 conf
OpenSHMEM
Sreeram Potluri, Anshuman Goswami, Manjunath Gorentla Venkata, Neena Imam
2017 Misc conf
HiPC
Sreeram Potluri, Anshuman Goswami, Davide Rossetti, Chris J. Newburn, Manjunath Gorentla Venkata, Neena Imam
2017 B conf
CCGrid
Huansong Fu, Manjunath Gorentla Venkata, Ahana Roy Choudhury, Neena Imam, Weikuan Yu
2017 conf
eScience
Satyabrata Sen, Nageswara S. V. Rao, Qiang Liu, Neena Imam, Rajkumar Kettimuthu, Ian T. Foster
2017 conf
SysCon
Nageswara S. V. Rao, Neena Imam, Chris Y. T. Ma, Kjell Hausken, Fei He, Jun Zhuang
2017 conf
OpenSHMEM
John C. Linford, Samuel Khuvis, Sameer Shende, Allen D. Malony, Neena Imam, Manjunath Gorentla Venkata
2017 conf
OpenSHMEM
Huansong Fu, Manjunath Gorentla Venkata, Neena Imam, Weikuan Yu
2017 conf
IPDPS Workshops
Dylan Machovec, Sudeep Pasricha, Anthony A. Maciejewski, Howard Jay Siegel, Gregory A. Koenig, Michael Wright, Marcia Hilton, Rajendra Rambharos, Thomas J. Naughton, Neena Imam
2017 J jnl
Entropy
Jonathan Schrock, Alexander J. McCaskey, Kathleen E. Hamilton, Travis S. Humble, Neena Imam
2016 conf
IPDPS Workshops
Dylan Machovec, Bhavesh Khemka, Sudeep Pasricha, Anthony A. Maciejewski, Howard Jay Siegel, Gregory A. Koenig, Michael Wright, Marcia Hilton, Rajendra Rambharos, Neena Imam
2016 conf
HPCC/SmartCity/DSS
Nageswara S. V. Rao, Qiang Liu, Satyabrata Sen, Greg Hinkel, Neena Imam, Ian T. Foster, Rajkumar Kettimuthu, Bradley W. Settlemyer, Chase Q. Wu, Daqing Yun
2016 conf
OpenSHMEM
Eduardo F. D'Azevedo, Sarah Powers, Neena Imam
2016 ed.
OpenSHMEM
Manjunath Gorentla Venkata, Neena Imam, Swaroop Pophale, Tiffany M. Mintz
2016 conf
IPDPS Workshops
Travis S. Humble, Alexander J. McCaskey, Jonathan Schrock, Hadayat Seddiqi, Keith A. Britt, Neena Imam
2016 J jnl
CoRR
Travis S. Humble, Alexander J. McCaskey, Jonathan Schrock, Hadayat Seddiqi, Keith A. Britt, Neena Imam
2016 conf
OpenSHMEM
John C. Linford, Samuel Khuvis, Sameer Shende, Allen D. Malony, Neena Imam, Manjunath Gorentla Venkata
2016 conf
IPDPS Workshops
Natalie J. Bates, Chung-Hsing Hsu, Neena Imam, Torsten Wilde, Dale Sartor
2016 J jnl
ACM Comput. Surv.
Robert A. Bridges, Neena Imam, Tiffany M. Mintz
2016 conf
OpenSHMEM
Megan Grodowitz, Eduardo F. D'Azevedo, Sarah Powers, Neena Imam
2015 conf
OpenSHMEM
Eduardo F. D'Azevedo, Neena Imam
2015 ed.
OpenSHMEM
Manjunath Gorentla Venkata, Pavel Shamis, Neena Imam, M. Graham Lopez
2015 J jnl
CoRR
Neena Imam, Michael J. Brim, Sarp Oral
2012 J jnl
Concurr. Comput. Pract. Exp.
Jacob Barhen, Travis S. Humble, Pramita Mitra, Neena Imam, Bryan Schleck, Charlotte Kotas, Michael Traweek
2010 conf
CrownCom
Jacob Barhen, Charlotte Kotas, Travis S. Humble, Pramita Mitra, Neena Imam, Mark A. Buckner, Michael Roy Moore
2009 J jnl
J. Sensors
Neena Imam, Jacob Barhen
2004 B conf
IJCNN
Sarit Barhen, Vladimir A. Protopopescu, Jack Wells, Neena Imam, Jacob Barhen
redb/extractors/pe_extractors/pe_extra_findings.py
← Index redb/extractors/pe_extractors/pe_extra_findings.py python
from hashlib import md5, sha1, sha256
import inspect
import pefile
from magika import Magika
import json
from datetime import datetime, timezone
from typing import List, Optional, Any
from asn1crypto import cms, pem, x509, core
from dataclasses import asdict

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PEExtraFinding, PECertificate


class PEExtraFindings(PEExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            pe,
        )
        self.elastic_index = self.index_prefix + "-pe_extrafindings"
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.has_binary_overlay = False
        self.has_binary_resource = False
        self.findings = []

    def tag(self):
        return Tag.PE_EMBEDDED_EXTRAS.value

    """
    The section below triggers in case of a binary which is not signed.
    It trigger the scan for Certificates inside the binary, for example
    inside a resource or an overlay.
    """

    def _scan_for_certificates(self):
        """
        Comprehensive scan for certificate data in PE file.
        Returns list of tuples (location_description, certificate_data)
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        # 1. Scan resources for embedded PE files
        self._scan_resources_for_certificates()

        # 3. Scan overlay
        overlay_data = self.pe.get_overlay()
        if overlay_data:
            self._scan_overlay_for_certificates(overlay_data)


    def _extract_certificate_info(self, cert_data):
        self.log.debug(inspect.currentframe().f_code.co_name)

        certificate = x509.Certificate.load(cert_data)
        certificate_serial_number = format(certificate.serial_number, "x").upper()
        grouped_serial_number = ":".join(
            [
                certificate_serial_number[i : i + 2]
                for i in range(0, len(certificate_serial_number), 2)
            ]
        )
        return PECertificate(
            certificate_serial_number=grouped_serial_number,
            certificate_issuer=certificate.issuer.human_friendly,
            certificate_subject=certificate.subject.human_friendly,
            certificate_valid_from=certificate["tbs_certificate"]["validity"][
                "not_before"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_valid_to=certificate["tbs_certificate"]["validity"][
                "not_after"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_thumbprint=sha1(cert_data).hexdigest().upper(),
            certificate_algorithm=None,
        )

    def _extract_standard_certificates(self, pe):
        self.log.debug(inspect.currentframe().f_code.co_name)
        address = pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].VirtualAddress
        size = pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].Size

        addr_8 = address + 8
        signature_data = bytes(
            pe.write()[addr_8 : addr_8 + size]  # noqa E203
        )  # Ensure this is a bytes object
        if pem.detect(signature_data):
            signature_data = pem.unarmor(signature_data)

        content_info = cms.ContentInfo.load(signature_data)
        signed_data = content_info["content"]
        certificates = signed_data["certificates"]

        certificates_list = []
        for cert in certificates:
            cert_info = self._extract_certificate_info(cert.chosen.dump())
            certificates_list.append(cert_info)

        return certificates_list

    def _is_signed(self, pedata):
        address = pedata.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].VirtualAddress
        if address == 0:
            return False
        return True

    def _scan_resources_for_certificates(self):
        """Scan resources for embedded PE files and their certificates"""
        self.log.debug(inspect.currentframe().f_code.co_name)

        try:
            if hasattr(self.pe, "DIRECTORY_ENTRY_RESOURCE"):
                for entry in self.pe.DIRECTORY_ENTRY_RESOURCE.entries:
                    for resource in self._get_resource_data(entry):
                        # Check if resource data might be a PE file
                        resource_magika = Magika().identify_bytes(resource).output.label
                        if resource.startswith(b"MZ") or resource_magika == "pebin":
                            try:
                                embedded_pe = pefile.PE(data=resource)
                                if self._is_signed(embedded_pe):
                                    cert_data = self._extract_standard_certificates(
                                        embedded_pe
                                    )
                                    if cert_data:
                                        # certificates.append(
                                        #     (f"Resource_{entry.id}", cert_data)
                                        # )
                                        self.findings.append(
                                            PEExtraFinding(
                                                context=f"Resource ({sha256(resource).hexdigest()}) is a PE file. Found Code Signing Certificates information inside.",
                                                finding=cert_data,
                                            )
                                        )
                            except Exception as e:
                                self.log.warning(
                                    f"Resource {sha256(resource).hexdigest()} is not a valid PE: {e}"
                                )

                        # Direct certificate pattern matching in resource
                        cert_data = self._find_certificate_patterns(resource)
                        if cert_data:
                            # certificates.append((f"Resource_{entry.id}", cert_data))
                            self.findings.append(
                                PEExtraFinding(
                                    context=f"Resource ({sha256(resource).hexdigest()}) is a PE file.\
                                    Found Code Signing Certificates information inside.",
                                    finding=cert_data,
                                )
                            )

        except Exception as e:
            self.log.error(f"Failed to scan resources: {e}")


    def _scan_overlay_for_certificates(self, overlay_data) -> List[bytes]:
        """Scan PE overlay for certificate data"""
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            # Check if overlay is a PE file
            overlay_magika = Magika().identify_bytes(overlay_data).output.ct_label
            if overlay_data.startswith(b"MZ") or overlay_magika == "pebin":
                try:
                    overlay_pe = pefile.PE(data=overlay_data)
                    if self._is_signed(overlay_pe):
                        cert_data = self._extract_standard_certificates(overlay_data)
                        if cert_data:
                            self.findings.append(
                                PEExtraFinding(
                                    context=f"Overlay data ({sha256(overlay_data).hexdigest()}) is a PE file.\
                                    Found Code Signing Certificates information inside.",
                                    finding=cert_data,
                                )
                            )
                except Exception as e:
                    self.log.warning(f"Error looking for certificates in Overlay: {e}")
                    pass

            # Direct certificate pattern matching in overlay
            cert_data = self._find_certificate_patterns(overlay_data)
            if cert_data:
                self.findings.append(
                    PEExtraFinding(
                        context=f"Overlay data ({sha256(overlay_data).hexdigest()}) is a PE file.\
                        Found Code Signing Certificates information inside.",
                        finding=cert_data,
                    )
                )
        except Exception as e:
            self.log.error(f"Failed to scan overlay: {e}")


    def _get_resource_data(self, entry) -> List[bytes]:
        """Recursively get resource data"""
        resources = []
        try:
            if hasattr(entry, "directory"):
                for subentry in entry.directory.entries:
                    resources.extend(self._get_resource_data(subentry))
            else:
                data = self.pe.get_data(
                    entry.data.struct.OffsetToData, entry.data.struct.Size
                )
                resources.append(data)
        except Exception as e:
            self.log.error(f"Failed to get resource data: {e}")
        return resources

    def _find_certificate_patterns(self, data: bytes) -> Optional[bytes]:
        """Find certificate patterns in binary data"""
        # PKCS#7 SignedData OID pattern
        PKCS7_PATTERN = b"\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x07\x02"

        try:
            idx = data.find(PKCS7_PATTERN)
            if idx != -1:
                # Search backwards for ASN.1 sequence marker
                for i in range(idx, max(0, idx - 50), -1):
                    if data[i] == 0x30:  # ASN.1 SEQUENCE
                        try:
                            # Try to parse as X.509 certificate
                            cert = x509.load_der_x509_certificate(
                                data[i:], default_backend()
                            )
                            return data[i:]
                        except Exception:
                            continue
        except Exception as e:
            self.log.error(f"Failed to find certificate patterns: {e}")
        return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)
        if exporter_type == "ElasticsearchExporter":
            return self.findings
        elif exporter_type == "ClickHouseExporter":
            current_time = datetime.now(timezone.utc)
            
            data = [
                [
                    self.sha256,
                    self.md5,
                    self.sha1,
                    finding.context,
                    [asdict(cert) for cert in finding.finding] if finding.finding else None,
                    current_time
                ]
                for finding in self.findings
            ]
            
            column_names = [
                'sha256', 'md5', 'sha1', 'context', 'finding', 'analysis_date'
            ]
            
            if not data:
                return None

            column_type_names = [
                'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                'String', 'Array(JSON)', 'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "redb_extra_findings"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            self._scan_for_certificates()
            if len(self.findings) > 0:
                return self.findings
            return None
        except Exception as e:
            self.log.error(f"Error extracting PE Extras: {e}")
            return None