Nancy G. Leveson

83 papers A* 7A 4C 1Misc 2Journal 49Unranked 19
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Software Eng.
Nancy G. Leveson
2025 J jnl
IEEE Trans. Software Eng.
Mats P. E. Heimdahl, Nancy G. Leveson
2024 J jnl
CoRR
Sandeep Banik, Jinrae Kim, Naira Hovakimyan, Luca Carlone, John P. Thomas, Nancy G. Leveson
2024 conf
TE
Alexander P. Hillman, Nancy G. Leveson
2023 J jnl
Commun. ACM
Nancy G. Leveson, John P. Thomas
2019 J jnl
J. Aerosp. Inf. Syst.
Andrea Scarinci, Amanda Quilici, Danilo Ribeiro, Felipe Oliveira, Daniel Patrick, Nancy G. Leveson
2017 J jnl
Computer
Nancy G. Leveson
2016 J jnl
IEEE Trans. Intell. Transp. Syst.
Cody H. Fleming, Nancy G. Leveson
2015 J jnl
Reliab. Eng. Syst. Saf.
Nancy G. Leveson
2014 J jnl
Commun. ACM
William Young, Nancy G. Leveson
2014 J jnl
J. Aerosp. Inf. Syst.
Cody Harrison Fleming, Nancy G. Leveson
2014 conf
GI-Jahrestagung
Kip Johnson, Nancy G. Leveson
2014 conf
GI-Jahrestagung
Nancy G. Leveson
2013 J jnl
Commun. ACM
Nancy G. Leveson
2013 A conf
ACSAC
William Young, Nancy G. Leveson
2012 conf
HILT
Nancy G. Leveson, Cody Harrison Fleming, John Thomas
2011 conf
CSDM
Nancy G. Leveson
2010 J jnl
Proc. IEEE
Margaret V. Stringfellow, Nancy G. Leveson, Brandon Owens
2010 J jnl
Requir. Eng.
Israel Navarro, Nancy G. Leveson, Kristina Lundqvist
2009 C conf
SSS
Nancy G. Leveson
2008 J jnl
J. Am. Medical Informatics Assoc.
James M. Walker, Pascale Carayon, Nancy G. Leveson, Ronald A. Paulus, John Tooker, Homer L. Chin, Albert Bothe Jr., Walter F. Stewart
2006 J jnl
J. Aerosp. Comput. Inf. Commun.
Kathryn Anne Weiss, Nicolas Dulac, Stephanie Chiesi, Mirna Daouk, David Zipkin, Nancy G. Leveson
2006 J jnl
Commun. ACM
John C. Knight, Nancy G. Leveson
2005 Misc conf
WSC
Nicolas Dulac, Nancy G. Leveson, David Zipkin, Stephen Friedenthal, Joel Cutcher-Gershenfeld, John S. Carroll, Betty Barrett
2004 J jnl
IEEE Trans. Dependable Secur. Comput.
Nancy G. Leveson
2004 conf
SIGSOFT FSE
Nancy G. Leveson, Kathryn Anne Weiss
2004 J jnl
IEEE Softw.
Victor R. Basili, Barry W. Boehm, Al Davis, Watts S. Humphrey, Nancy G. Leveson, Nancy R. Mead, John D. Musa, David Lorge Parnas, Shari Lawrence Pfleeger, Elaine J. Weyuker
2002 Misc conf
EMSOFT
Nancy G. Leveson
2002 A* conf
ICSE
Marc K. Zimmerman, Kristina Lundqvist, Nancy G. Leveson
2002 A conf
RE
Nicolas Dulac, Thomas Viguier, Nancy G. Leveson, Margaret-Anne D. Storey
2002 J jnl
Commun. ACM
John C. Knight, Nancy G. Leveson
2002 conf
CSEE&T
Nancy G. Leveson
2000 conf
FMSP
Nancy G. Leveson
2000 conf
HSCC
Nancy G. Leveson
2000 J jnl
IEEE Trans. Software Eng.
Nancy G. Leveson
1999 conf
ESEC / SIGSOFT FSE
Nancy G. Leveson, Mats Per Erik Heimdahl, Jon Damon Reese
1999 J jnl
ACM SIGSOFT Softw. Eng. Notes
Victor R. Basili, Laszlo A. Belady, Barry W. Boehm, Frederick P. Brooks Jr., James Browne, Richard A. DeMillo, Stuart I. Feldman, Cordell Green, Butler W. Lampson, Duncan H. Lawrie, Nancy G. Leveson, Nancy A. Lynch, Mark D. Weiser, Jeannette M. Wing
1998 conf
ZUM
Nancy G. Leveson
1998 conf
ICRE
Nancy G. Leveson
1997 A conf
RE
Francesmary Modugno, Nancy G. Leveson, Jon Damon Reese, Kurt Partridge, Sean D. Sandys
1997 J jnl
Requir. Eng.
Francesmary Modugno, Nancy G. Leveson, Jon Damon Reese, Kurt Partridge, Sean D. Sandys
1997 A* conf
ICSE
Jon Damon Reese, Nancy G. Leveson
1997 J jnl
Commun. ACM
Nancy G. Leveson
1996 J jnl
IEEE Trans. Software Eng.
Mats Per Erik Heimdahl, Nancy G. Leveson
1996 A conf
ISSTA
Richard Denney, Richard A. Kemmerer, Nancy G. Leveson, Alberto Savoia
1995 A* conf
ICSE
Mats Per Erik Heimdahl, Nancy G. Leveson
1995 J jnl
Commun. ACM
Nancy G. Leveson
1995 book
Safeware - system safety and computers: a guide to preventing accidents and losses caused by technology.
Nancy G. Leveson
1995 J jnl
Commun. ACM
Maria M. Klawe, Nancy G. Leveson
1994 conf
ACM Conference on Computer Science
Nancy G. Leveson
1994 J jnl
Computer
Nancy G. Leveson
1994 J jnl
IEEE Trans. Software Eng.
Nancy G. Leveson, Mats Per Erik Heimdahl, Holly Hildreth, Jon Damon Reese
1993 J jnl
IEEE Trans. Software Eng.
Nancy G. Leveson, Peter G. Neumann
1993 J jnl
Computer
Nancy G. Leveson, Clark Savage Turner
1992 A* conf
ICSE
Nancy G. Leveson
1991 J jnl
IEEE Trans. Software Eng.
Timothy J. Shimeall, Nancy G. Leveson
1991 conf
IWSSD
Nancy G. Leveson, Mats P. E. Heimdahl, Holly Hildreth, Jon Damon Reese, R. Ortega
1991 J jnl
IEEE Softw.
Nancy G. Leveson, Stephen S. Cha, Timothy J. Shimeall
1991 J jnl
IEEE Trans. Software Eng.
Matthew S. Jaffe, Nancy G. Leveson, Mats Per Erik Heimdahl, Bonnie E. Melhart
1991 J jnl
Commun. ACM
Nancy G. Leveson
1990 J jnl
ACM SIGSOFT Softw. Eng. Notes
John C. Knight, Nancy G. Leveson
1990 J jnl
IEEE Trans. Software Eng.
Susan S. Brilliant, John C. Knight, Nancy G. Leveson
1990 A* conf
ICSE
Nancy G. Leveson
1990 J jnl
IEEE Trans. Software Eng.
Nancy G. Leveson
1990 J jnl
IEEE Softw.
Nancy G. Leveson
1990 J jnl
IEEE Trans. Software Eng.
Nancy G. Leveson, Stephen S. Cha, John C. Knight, Timothy J. Shimeall
1989 conf
IWSSD
Bonnie E. Melhart, Nancy G. Leveson, Matthew S. Jaffe
1989 A* conf
ICSE
Matthew S. Jaffe, Nancy G. Leveson
1989 J jnl
IEEE Trans. Software Eng.
Susan S. Brilliant, John C. Knight, Nancy G. Leveson
1988 A* conf
ICSE
Stephen S. Cha, Nancy G. Leveson, Timothy J. Shimeall
1987 J jnl
IEEE Trans. Software Eng.
Nancy G. Leveson, Janice L. Stolzy
1987 conf
Fehlertolerierende Rechensysteme
Nancy G. Leveson
1987 J jnl
ACM SIGSOFT Softw. Eng. Notes
Susan S. Brilliant, John C. Knight, Nancy G. Leveson
1986 J jnl
IEEE Trans. Software Eng.
John C. Knight, Nancy G. Leveson
1986 J jnl
ACM Comput. Surv.
Nancy G. Leveson
1985 conf
TAPSOFT, Vol.2
Nancy G. Leveson, Janice L. Stolzy
1985 conf
TFAIS
Randell S. Flint, Nancy G. Leveson
1984 J jnl
Computer
Nancy G. Leveson
1983 J jnl
IEEE Trans. Software Eng.
Nancy G. Leveson, Peter R. Harvey
1983 J jnl
Inf. Syst.
Nancy G. Leveson, Anthony I. Wasserman, Daniel M. Berry
1983 J jnl
J. Syst. Softw.
Nancy G. Leveson, Peter R. Harvey
1982 J jnl
ACM SIGSOFT Softw. Eng. Notes
Nancy G. Leveson
1981 conf
DDSS
Nancy G. Leveson, Anthony I. Wasserman
redb/extractors/elf_extractors/elf_symbols.py
← Index redb/extractors/elf_extractors/elf_symbols.py python
import inspect
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFSymbol


class ELFSymbolExtractor(ELFExtractor):

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

    def _map_symbol_type(self, st_type_str: str) -> int:
        """Map symbol type string to enum value."""
        type_map = {
            'STT_NOTYPE': 0,
            'STT_OBJECT': 1,
            'STT_FUNC': 2,
            'STT_SECTION': 3,
            'STT_FILE': 4,
            'STT_COMMON': 5,
            'STT_TLS': 6
        }
        return type_map.get(st_type_str, 0)

    def _map_symbol_bind(self, st_bind_str: str) -> int:
        """Map symbol binding string to enum value."""
        bind_map = {
            'STB_LOCAL': 0,
            'STB_GLOBAL': 1,
            'STB_WEAK': 2
        }
        return bind_map.get(st_bind_str, 0)

    def _map_symbol_visibility(self, st_vis_str: str) -> int:
        """Map symbol visibility string to enum value."""
        vis_map = {
            'STV_DEFAULT': 0,
            'STV_INTERNAL': 1,
            'STV_HIDDEN': 2,
            'STV_PROTECTED': 3
        }
        return vis_map.get(st_vis_str, 0)

    def _extract_symbol_data(self, symbol, is_dynamic: bool = False) -> Dict:
        """Extract data from a single symbol."""
        try:
            # Get symbol name (handle empty names)
            symbol_name = symbol.name if symbol.name else f"<unnamed_{symbol.entry.get('st_name', 0)}>"

            # Get symbol properties
            symbol_value = symbol.entry.get('st_value', 0)
            symbol_size = symbol.entry.get('st_size', 0)

            # Handle section index - can be integer or special string like 'SHN_UNDEF'
            st_shndx_raw = symbol.entry.get('st_shndx', 0)
            if isinstance(st_shndx_raw, str):
                # Map special section index strings to integers
                shndx_map = {
                    'SHN_UNDEF': 0,
                    'SHN_ABS': 65521,  # 0xFFF1
                    'SHN_COMMON': 65522,  # 0xFFF2
                    'SHN_XINDEX': 65535,  # 0xFFFF
                }
                symbol_section_index = shndx_map.get(st_shndx_raw, 0)
                symbol_section_index_str = st_shndx_raw.replace('SHN_', '') if st_shndx_raw.startswith('SHN_') else st_shndx_raw
            else:
                symbol_section_index = st_shndx_raw
                symbol_section_index_str = str(st_shndx_raw)

            # Get symbol type and map to enum
            st_type_str = symbol.entry.get('st_info', {}).get('type', 'STT_NOTYPE')
            symbol_type_enum = self._map_symbol_type(st_type_str)
            symbol_type_str = st_type_str.replace('STT_', '') if st_type_str.startswith('STT_') else st_type_str

            # Get symbol binding and map to enum
            st_bind_str = symbol.entry.get('st_info', {}).get('bind', 'STB_LOCAL')
            symbol_bind_enum = self._map_symbol_bind(st_bind_str)
            symbol_bind_str = st_bind_str.replace('STB_', '') if st_bind_str.startswith('STB_') else st_bind_str

            # Get symbol visibility and map to enum
            st_vis_str = symbol.entry.get('st_other', {}).get('visibility', 'STV_DEFAULT')
            symbol_visibility_enum = self._map_symbol_visibility(st_vis_str)
            symbol_visibility_str = st_vis_str.replace('STV_', '') if st_vis_str.startswith('STV_') else st_vis_str

            return ELFSymbol(
                symbol_name=symbol_name,
                symbol_value=symbol_value,
                symbol_size=symbol_size,
                symbol_type=symbol_type_enum,
                symbol_type_str=symbol_type_str,
                symbol_bind=symbol_bind_enum,
                symbol_bind_str=symbol_bind_str,
                symbol_visibility=symbol_visibility_enum,
                symbol_visibility_str=symbol_visibility_str,
                symbol_section_index=symbol_section_index,
                symbol_section_index_str=symbol_section_index_str,
                is_dynamic=1 if is_dynamic else 0
            )

        except Exception as e:
            self.log.error(f"Error extracting symbol data: {e}")
            return None

    def _extract_symbols_from_section(self, elf, section_name: str, is_dynamic: bool = False) -> List[Dict]:
        """Extract symbols from a specific symbol table section."""
        symbols = []

        try:
            section = elf.get_section_by_name(section_name)
            if not section:
                self.log.debug(f"No {section_name} section found")
                return symbols

            if not hasattr(section, 'iter_symbols'):
                self.log.debug(f"Section {section_name} is not a symbol table")
                return symbols

            # Iterate through symbols in the section with per-symbol error handling
            for symbol_index, symbol in enumerate(section.iter_symbols()):
                try:
                    symbol_data = self._extract_symbol_data(symbol, is_dynamic)
                    if symbol_data:
                        symbols.append(symbol_data)
                except Exception as e:
                    self.log.warning(f"Error processing symbol {symbol_index} in {section_name}: {e}")
                    # Continue with other symbols

        except Exception as e:
            self.log.error(f"Error extracting symbols from {section_name}: {e}")

        return symbols

    def tag(self):
        return Tag.ELF_SYMBOLS.value if hasattr(Tag, 'ELF_SYMBOLS') else "elf_symbols"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                all_symbols = []

                # Extract static symbols from .symtab with individual error handling
                try:
                    static_symbols = self._extract_symbols_from_section(elf, '.symtab', is_dynamic=False)
                    all_symbols.extend(static_symbols)
                    self.log.debug(f"Extracted {len(static_symbols)} static symbols from .symtab")
                except Exception as e:
                    self.log.warning(f"Error extracting static symbols from .symtab: {e}")

                # Extract dynamic symbols from .dynsym with individual error handling
                try:
                    dynamic_symbols = self._extract_symbols_from_section(elf, '.dynsym', is_dynamic=True)
                    all_symbols.extend(dynamic_symbols)
                    self.log.debug(f"Extracted {len(dynamic_symbols)} dynamic symbols from .dynsym")
                except Exception as e:
                    self.log.warning(f"Error extracting dynamic symbols from .dynsym: {e}")

                return all_symbols

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_symbols = result
            return self.elf_symbols

        except Exception as e:
            self.log.error(f"Error extracting ELF symbols {self.hash.sha256}: {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.elf_symbols
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no symbols (e.g., stripped binary)
                # None is reserved for actual errors

                # Prepare data arrays for all symbols
                data = []
                current_time = datetime.now(timezone.utc)
                for symbol in self.elf_symbols:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        symbol.symbol_name,
                        symbol.symbol_value,
                        symbol.symbol_size,
                        symbol.symbol_type,
                        symbol.symbol_type_str,
                        symbol.symbol_bind,
                        symbol.symbol_bind_str,
                        symbol.symbol_visibility,
                        symbol.symbol_visibility_str,
                        symbol.symbol_section_index,
                        symbol.symbol_section_index_str,
                        symbol.is_dynamic,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'symbol_name', 'symbol_value', 'symbol_size',
                    'symbol_type', 'symbol_type_str',
                    'symbol_bind', 'symbol_bind_str',
                    'symbol_visibility', 'symbol_visibility_str',
                    'symbol_section_index', 'symbol_section_index_str', 'is_dynamic',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt64', 'UInt64',
                    "Enum8('NOTYPE'=0, 'OBJECT'=1, 'FUNC'=2, 'SECTION'=3, 'FILE'=4, 'COMMON'=5, 'TLS'=6)",
                    'LowCardinality(String)',
                    "Enum8('LOCAL'=0, 'GLOBAL'=1, 'WEAK'=2)",
                    'LowCardinality(String)',
                    "Enum8('DEFAULT'=0, 'INTERNAL'=1, 'HIDDEN'=2, 'PROTECTED'=3)",
                    'LowCardinality(String)',
                    'UInt16', 'LowCardinality(String)', 'UInt8',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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