TIED, Libsafeplus: Tools for Runtime Buffer Overflow Protection

Total Page:16

File Type:pdf, Size:1020Kb

TIED, Libsafeplus: Tools for Runtime Buffer Overflow Protection TIED, LibsafePlus: Tools for Runtime Buffer Overflow Protection Kumar Avijit Prateek Gupta Deepak Gupta Department of Computer Science and Engineering Indian Institute Of Technology, Kanpur Email: {avijitk,pgupta,deepak}@iitk.ac.in Abstract In a buffer overflow attack, the attacker’s aim is to gain Buffer overflow exploits make use of the treatment of strings access to a system by changing the control flow of a pro- in C as character arrays rather than as first-class objects. gram so that the program executes code that has been care- Manipulation of arrays as pointers and primitive pointer fully crafted by the attacker. The code can be inserted in the arithmetic make it possible for a program to access memory address space of the program using any legitimate form of in- locations which it is not supposed to access. There have been put. The attacker then corrupts a code pointer in the address many efforts in the past to overcome this vulnerability by per- space by overflowing a buffer and makes it point to the in- forming array bounds checking in C. Most of these solutions jected code. When the program later dereferences this code are either inadequate, inefficient or incompatible with legacy pointer, it jumps to the attacker’s code. Such buffer overflows code. In this paper, we present an efficient and transparent occur mainly due to the lack of bounds checking in C library runtime approach for protection against all known forms of functions and carelessness on the programmer’s part. For ex- buffer overflow attacks. Our solution consists of two tools: ample, the use of strcpy() in a program without ensuring TIED (Type Information Extractor and Depositor) and Lib- that the destination buffer is at least as large as the source safePlus. TIED extracts size information of all global and au- string is apparently a common practice among many C pro- tomatic buffers defined in the program from the debugging in- grammers. formation produced by the compiler and inserts it back in the Buffer overflow exploits come in various flavours. The program binary as a data structure available at runtime. Lib- simplest and also the most widely exploited form of attack safePlus is a dynamic library which provides wrapper func- changes the control flow of the program by overflowing some tions for unsafe C library functions such as strcpy. These buffer on the stack so that the return address or the saved wrapper functions check the source and target buffer sizes us- frame pointer is modified. This is commonly called the “stack ing the information made available by TIED and perform the smashing attack” [3]. Other more complex forms of attacks requested operation only when it is safe to do so. For dy- may not change the return address but attempt to change the namically allocated buffers, the sizes and starting addresses program control flow by corrupting some other code point- are recorded at runtime. With our simple design we are able ers (such as function pointers, GOT entries, longjmp buffers, to protect most applications with a performance overhead of etc.) by overflowing a buffer that may be local, global or dy- less than 10%. namically allocated. Many common forms of buffer overflow attacks are described in [4]. 1 Introduction Due to the huge amount of legacy C code existing today, which lacks bounds checking, an efficient runtime solution Buffer overflows constitute a major threat to the security of is needed to protect the code from buffer overflows. Other computer systems today. A buffer overflow exploit is both solutions which have developed over the years such as man- common and powerful, and is capable of rendering a com- ual/automatic auditing of the code, static analysis of pro- puter system totally vulnerable to the attacker. As reported grams, etc., are mostly incomplete as they do not prevent all by CERT, 11 out of 20 most widely exploited attacks have attacks. A runtime solution is required because certain type been found to be buffer overflow attacks [1]. More than 50% of information is not available statically. For example, infor- of CERT advisories [2] for the year 2003 reported buffer over- mation about dynamically allocated buffers is available only flow vulnerabilities. It is thus a major concern of the comput- at runtime. However, most current runtime solutions are un- ing community to provide a practical and efficient solution to acceptable because they either do not protect against all forms the problem of buffer overflows. of buffer overflow attacks, break existing code, or impose too high an overhead to be successfully used with common ap- for unsafe C library functions. Each such wrapper function plications. An acceptable solution must tackle all of these checks the bounds of the destination buffer before performing problems. the actual operation. For dynamically allocated buffers, Lib- In this paper, we present a simple yet robust solution to safePlus maintains an additional runtime data structure that guard against all known forms of buffer overflow attacks. The stores information about the locations and sizes of all dynam- solution is a transparent runtime approach to prevent such at- ically allocated buffers. In contrast to other approaches which tacks and consists of two tools: TIED and LibsafePlus. Lib- are mainly compiler extensions, LibsafePlus does not require safePlus is a dynamically loadable library and is an extension source code access if the program is compiled with the -g to Libsafe [5]. LibsafePlus contains wrapper functions for un- option and is not statically linked with the C library. safe C library functions such as strcpy. A wrapper function determines the source and target buffer sizes and performs the required operation only if it would not result in an overflow. To enable runtime size checking we need to have additional type information about all buffers in the program. This is done by compiling the target program with the -g debugging option. TIED (Type Information Extractor and Depositor) is a tool that extracts the debugging information from a program binary and then augments the binary with an additional data structure containing the size information for all buffers in the Figure 1: Rewriting of the binary executable by TIED and program. This information is utilized by LibsafePlus to range runtime range checking by LibsafePlus check buffers at runtime. For keeping track of the sizes of dynamically allocated buffers, LibsafePlus intercepts calls to LibsafePlus is implemented as an extension to Libsafe [5]. the malloc family of functions. Our tools thus neither re- Libsafe is also a dynamically loadable library which pro- quire access to the source code (if it was compiled with the -g vides wrapper functions for unsafe C library functions such option) nor any modifications to the compiler, and are com- as strcpy(). However, Libsafe protects only against stack pletely compatible with legacy C code. The tools have been smashing attacks. Even for stack variables, Libsafe assumes found to be effective against all forms of attacks and impose a a safe upper bound on the size of a buffer instead of deter- low runtime performance overhead of less than 10% for most mining its exact size. Therefore, it is possible for the attacker applications. to change variables in the program that are next to the buffer The rest of the paper is organized as follows. We present in memory. Unlike Libsafe, our tools offer full protection an overview of our approach in Section 2. Section 3 de- against all forms of attack and determine the exact sizes of scribes the implementation of TIED and LibsafePlus. This all buffers. They have been tested extensively and have been is followed by a description of performance experiments and found to be effective against all forms of buffer overruns. Our results, in Section 4. Section 5 briefly discusses the related tools successfully prevented all the 20 different overflow at- work done in the area of buffer overflow protection. Section 6 tacks in the testbed developed by Wilander and Kamkar for concludes the paper. testing tools for dynamic overflow attacks [6], while the orig- inal Libsafe could only detect only 6 of the 20 attacks. 2 Basic approach In the following subsections, we describe in detail the de- sign of Libsafe and our extensions to it. We first describe in The steps in the protection of a program using TIED and Lib- Section 2.1, the protection mechanism used by Libsafe and safePlus are shown in Figure 1. The key idea here is to aug- then show in Section 2.2, how LibsafePlus extends the basic ment the executable with information about the locations and protection mechanism, to handle all forms of buffer overflow sizes of character buffers. To this end, the program source attacks. must be compiled with the -g option which directs the com- piler to dump debugging information regarding the sizes and 2.1 Runtime range checking by Libsafe types of all variables in the program in the generated exe- cutable binary. The next step is to rewrite the executable with The goal of Libsafe is to prevent corruption of the return ad- the required information as an additional data structure in the dresses and saved frame pointers on the stack in the event form of a separate read-only section of the executable. This of a stack buffer overflow. Libsafe does not guarantee pro- makes the information about buffer sizes available at runtime. tection against any other form of attack. To ensure that the The binary rewriting of the executable is done by TIED. Lib- frame pointers and the return addresses are never overwrit- safePlus is implemented as a dynamically loadable library ten, Libsafe assumes a safe upper bound on the size of stack that must be preloaded for a process to be protected.
Recommended publications
  • Yutaka Oiwa. "Implementation of a Fail-Safe ANSI C Compiler"
    Implementation of a Fail-Safe ANSI C Compiler 安全な ANSI C コンパイラの実装手法 Doctoral Dissertation 博士論文 Yutaka Oiwa 大岩 寛 Submitted to Department of Computer Science, Graduate School of Information Science and Technology, The University of Tokyo on December 16, 2004 in partial fulfillment of the requirements for the degree of Doctor of Philosophy Abstract Programs written in the C language often suffer from nasty errors due to dangling pointers and buffer overflow. Such errors in Internet server programs are often ex- ploited by malicious attackers to “crack” an entire system, and this has become a problem affecting society as a whole. The root of these errors is usually corruption of on-memory data structures caused by out-of-bound array accesses. The C lan- guage does not provide any protection against such out-of-bound access, although recent languages such as Java, C#, Lisp and ML provide such protection. Never- theless, the C language itself should not be blamed for this shortcoming—it was designed to provide a replacement for assembly languages (i.e., to provide flexible direct memory access through a light-weight high-level language). In other words, lack of array boundary protection is “by design.” In addition, the C language was designed more than thirty years ago when there was not enough computer power to perform a memory boundary check for every memory access. The real prob- lem is the use of the C language for current casual programming, which does not usually require such direct memory accesses. We cannot realistically discard the C language right away, though, because there are many legacy programs written in the C language and many legacy programmers accustomed to the C language and its programming style.
    [Show full text]
  • WWW-Based Collaboration Environments with Distributed Tool Services
    WWWbased Collab oration Environments with Distributed To ol Services Gail E Kaiser Stephen E Dossick Wenyu Jiang Jack Jingshuang Yang SonnyXiYe Columbia University Department of Computer Science Amsterdam Avenue Mail Co de New York NY UNITED STATES fax kaisercscolumbiaedu CUCS February Abstract Wehave develop ed an architecture and realization of a framework for hyp ermedia collab oration environments that supp ort purp oseful work by orchestrated teams The hyp ermedia represents all plausible multimedia artifacts concerned with the collab orative tasks at hand that can b e placed or generated online from applicationsp ecic materials eg source co de chip layouts blueprints to formal do cumentation to digital library resources to informal email and chat transcripts The environment capabilities include b oth internal hyp ertext and external link server links among these artifacts which can b e added incrementally as useful connections are discovered pro jectsp ecic hyp ermedia search and browsing automated construction of artifacts and hyp erlinks according to the semantics of the group and individual tasks and the overall pro cess workow application of to ols to the artifacts and collab orativework for geographically disp ersed teams We present a general architecture for what wecallhyp ermedia subwebs and imp osition of groupspace services op erating on shared subwebs based on World Wide Web technology which could b e applied over the Internet andor within an organizational intranet We describ e our realization in OzWeb which
    [Show full text]
  • LISTSERV 16.0 Site Manager's Operations Manual
    Information in this document is subject to change without notice. Companies, names, and data used in examples herein are fictitious unless otherwise noted. L-Soft does not endorse or approve the use of any of the product names or trademarks appearing in this document. Permission is granted to copy this document, at no charge and in its entirety, if the copies are not used for commercial advantage, the source is cited, and the present copyright notice is included in all copies. Recipients of such copies are equally bound to abide by the present conditions. Prior written permission is required for any commercial use of this document, in whole or in part, and for any partial reproduction of the contents of this document exceeding 50 lines of up to 80 characters, or equivalent. The title page, table of contents, and index, if any, are not considered to be part of the document for the purposes of this copyright notice, and can be freely removed if present. Copyright 2009 L-Soft international, Inc. All Rights Reserved Worldwide. LISTSERV is a registered trademark licensed to L-Soft international, Inc. ListPlex, CataList, and EASE are service marks of L-Soft international, Inc. LSMTP is a registered trademark of L-Soft international, Inc. The Open Group, Motif, OSF/1 UNIX and the “X” device are registered trademarks of The Open Group in the United State and other countries. Digital, Alpha AXP, AXP, Digital UNIX, OpenVMS, HP, and HP-UX are trademarks of Hewlett- Packard Company in the United States and other countries. Microsoft, Windows, Windows 2000, Windows XP, and Windows NT are registered trademarks of Microsoft Corporation in the United States and other countries.
    [Show full text]
  • Cognitive Abilities, Interfaces and Tasks: Effects on Prospective Information Handling in Email
    Cognitive Abilities, Interfaces and Tasks: Effects on Prospective Information Handling in Email by Jacek Stanisław Gwizdka A thesis submitted in conformity with the requirements for the degree of Doctor of Philosophy Graduate Department of Mechanical and Industrial Engineering University of Toronto © Copyright by Jacek Gwizdka 2004 “Cognitive Abilities, Interfaces and Tasks: Effects on Prospective Information Handling in Email” Degree of Doctor of Philosophy, 2004 Jacek Stanisław Gwizdka Department of Mechanical and Industrial Engineering, University of Toronto Abstract This dissertation is focused on new email user interfaces that may improve awareness and handling of task-laden messages in the inbox. The practical motivation for this research was to help email users process messages more effectively. A field study was conducted to examine email practices related to handling messages that refer to pending tasks. Individual differences in message handling style were observed, with one group of users transferring such messages out of their email pro- grams to other applications (e.g., calendars), while the other group kept prospective messages in email and used the inbox as a reminder of future events. Two novel graphical user interfaces were designed to facilitate monitoring and retrieval of prospective information from email messages. The TaskView interface displayed task- laden messages on a two-dimensional grid (with time on the horizontal axis). The WebT- askMail interface retained the two-dimensional grid, but extended the representation of pending tasks (added distinction between events and to-do's with deadlines), a vertical date reading line, and more space for email message headers. ii Two user studies were conducted to test hypothesized benefits of the new visual repre- sentations and to examine the effects of different levels of selected cognitive abilities on task-laden message handling performance.
    [Show full text]
  • Unix Quickref.Dvi
    Summary of UNIX commands Table of Contents df [dirname] display free disk space. If dirname is omitted, 1. Directory and file commands 1994,1995,1996 Budi Rahardjo ([email protected]) display all available disks. The output maybe This is a summary of UNIX commands available 2. Print-related commands in blocks or in Kbytes. Use df -k in Solaris. on most UNIX systems. Depending on the config- uration, some of the commands may be unavailable 3. Miscellaneous commands du [dirname] on your site. These commands may be a commer- display disk usage. cial program, freeware or public domain program that 4. Process management must be installed separately, or probably just not in less filename your search path. Check your local documentation or 5. File archive and compression display filename one screenful. A pager similar manual pages for more details (e.g. man program- to (better than) more. 6. Text editors name). This reference card, obviously, cannot de- ls [dirname] scribe all UNIX commands in details, but instead I 7. Mail programs picked commands that are useful and interesting from list the content of directory dirname. Options: a user's point of view. 8. Usnet news -a display hidden files, -l display in long format 9. File transfer and remote access mkdir dirname Disclaimer make directory dirname The author makes no warranty of any kind, expressed 10. X window or implied, including the warranties of merchantabil- more filename 11. Graph, Plot, Image processing tools ity or fitness for a particular purpose, with regard to view file filename one screenfull at a time the use of commands contained in this reference card.
    [Show full text]
  • Site Manager's Operations Manual for LISTSERV®, Version 14.3
    L-Soft international, Inc. Site Manager's Operations Manual for LISTSERV®, version 14.3 7 December 2004 LISTSERV 14.3 Release The reference number of this document is 0412-MD-01. Information in this document is subject to change without notice. Companies, names and data used in examples herein are fictitious unless otherwise noted. L-Soft international, Inc. does not endorse or approve the use of any of the product names or trademarks appearing in this document. Permission is granted to copy this document, at no charge and in its entirety, provided that the copies are not used for commercial advantage, that the source is cited and that the present copyright notice is included in all copies, so that the recipients of such copies are equally bound to abide by the present conditions. Prior written permission is required for any commercial use of this document, in whole or in part, and for any partial reproduction of the contents of this document exceeding 50 lines of up to 80 characters, or equivalent. The title page, table of contents and index, if any, are not considered to be part of the document for the purposes of this copyright notice, and can be freely removed if present. The purpose of this copyright is to protect your right to make free copies of this manual for your friends and colleagues, to prevent publishers from using it for commercial advantage, and to prevent ill-meaning people from altering the meaning of the document by changing or removing a few paragraphs. Copyright © 1996-2004 L-Soft international, Inc.
    [Show full text]
  • Tailored Application-Specific System Call Tables
    Tailored Application-specific System Call Tables Qiang Zeng, Zhi Xin, Dinghao Wu, Peng Liu, and Bing Mao ABSTRACT policies may be relaxed for setuid programs.1 Once a pro- The system call interface defines the services an operating gram is compromised, a uniform set of kernel services are system kernel provides to user space programs. An oper- potentially exposed to attackers as a versatile and handy ating system usually provides a uniform system call inter- toolkit. While a uniform system call interface simplifies op- face to all user programs, while in practice no programs erating system design, it does not meet the principle of least utilize the whole set of the system calls. Existing system privileges in the perspective of security, as the interface is call based sandboxing and intrusion detection systems fo- not tailored to the needs of applications. cus on confining program behavior using sophisticated finite state or pushdown automaton models. However, these au- Existing researches on system call based sandboxing and tomata generally incur high false positives when modeling intrusion detection focus on system call pattern checking program behavior such as signal handling and multithread- [16, 12, 31, 35, 7], arguments validation [35, 23, 25, 4, 3], ing, and the runtime overhead is usually significantly high. and call stack integrity verification [10, 15]. Some establish We propose to use a stateless model, a whitelist of system sophisticated models such as Finite State Automata (FSA) calls needed by the target program. Due to the simplicity [31, 35, 15, 13] and Pushdown Automata (PDA) [35, 14] we are able to construct the model via static analysis on by training [12, 31, 34, 10] or static analysis [35, 14, 15, the program's binary with much higher precision that in- 13], while others rely on manual configuration to specify the curs few false positives.
    [Show full text]
  • Pipenightdreams Osgcal-Doc Mumudvb Mpg123-Alsa Tbb
    pipenightdreams osgcal-doc mumudvb mpg123-alsa tbb-examples libgammu4-dbg gcc-4.1-doc snort-rules-default davical cutmp3 libevolution5.0-cil aspell-am python-gobject-doc openoffice.org-l10n-mn libc6-xen xserver-xorg trophy-data t38modem pioneers-console libnb-platform10-java libgtkglext1-ruby libboost-wave1.39-dev drgenius bfbtester libchromexvmcpro1 isdnutils-xtools ubuntuone-client openoffice.org2-math openoffice.org-l10n-lt lsb-cxx-ia32 kdeartwork-emoticons-kde4 wmpuzzle trafshow python-plplot lx-gdb link-monitor-applet libscm-dev liblog-agent-logger-perl libccrtp-doc libclass-throwable-perl kde-i18n-csb jack-jconv hamradio-menus coinor-libvol-doc msx-emulator bitbake nabi language-pack-gnome-zh libpaperg popularity-contest xracer-tools xfont-nexus opendrim-lmp-baseserver libvorbisfile-ruby liblinebreak-doc libgfcui-2.0-0c2a-dbg libblacs-mpi-dev dict-freedict-spa-eng blender-ogrexml aspell-da x11-apps openoffice.org-l10n-lv openoffice.org-l10n-nl pnmtopng libodbcinstq1 libhsqldb-java-doc libmono-addins-gui0.2-cil sg3-utils linux-backports-modules-alsa-2.6.31-19-generic yorick-yeti-gsl python-pymssql plasma-widget-cpuload mcpp gpsim-lcd cl-csv libhtml-clean-perl asterisk-dbg apt-dater-dbg libgnome-mag1-dev language-pack-gnome-yo python-crypto svn-autoreleasedeb sugar-terminal-activity mii-diag maria-doc libplexus-component-api-java-doc libhugs-hgl-bundled libchipcard-libgwenhywfar47-plugins libghc6-random-dev freefem3d ezmlm cakephp-scripts aspell-ar ara-byte not+sparc openoffice.org-l10n-nn linux-backports-modules-karmic-generic-pae
    [Show full text]
  • Index Images Download 2006 News Crack Serial Warez Full 12 Contact
    index images download 2006 news crack serial warez full 12 contact about search spacer privacy 11 logo blog new 10 cgi-bin faq rss home img default 2005 products sitemap archives 1 09 links 01 08 06 2 07 login articles support 05 keygen article 04 03 help events archive 02 register en forum software downloads 3 security 13 category 4 content 14 main 15 press media templates services icons resources info profile 16 2004 18 docs contactus files features html 20 21 5 22 page 6 misc 19 partners 24 terms 2007 23 17 i 27 top 26 9 legal 30 banners xml 29 28 7 tools projects 25 0 user feed themes linux forums jobs business 8 video email books banner reviews view graphics research feedback pdf print ads modules 2003 company blank pub games copyright common site comments people aboutus product sports logos buttons english story image uploads 31 subscribe blogs atom gallery newsletter stats careers music pages publications technology calendar stories photos papers community data history arrow submit www s web library wiki header education go internet b in advertise spam a nav mail users Images members topics disclaimer store clear feeds c awards 2002 Default general pics dir signup solutions map News public doc de weblog index2 shop contacts fr homepage travel button pixel list viewtopic documents overview tips adclick contact_us movies wp-content catalog us p staff hardware wireless global screenshots apps online version directory mobile other advertising tech welcome admin t policy faqs link 2001 training releases space member static join health
    [Show full text]
  • Linux-FAQ.Pdf
    The Linux FAQ David C. Merrill david −AT− lupercalia.net 2003−09−19 Revision History Revision 1.20 2001−12−04 Revised by: rk Revision 2.0 2002−04−25 Revised by: dcm Some reorganization and markup changes. Revision 2.1 2003−05−19 Revised by: dcm Fairly complete reorganization and conversion to WikiText. Revision 2.1.1 2003−09−19 Revised by: dcm Minor corrections. Revision 2.1.2 2004−02−28 Revised by: dcm Minor corrections. This is the list of Frequently Asked Questions for Linux, the Free/Open Source UNIX−like operating system kernel that runs on many modern computer systems. The Linux FAQ Table of Contents 1. Introduction.....................................................................................................................................................1 1.1. About the FAQ..................................................................................................................................1 1.2. Asking Questions and Sending Comments.......................................................................................1 1.3. Authorship and Acknowledgments...................................................................................................1 1.4. Copyright and License......................................................................................................................2 1.5. Disclaimer.........................................................................................................................................2 2. General Information.......................................................................................................................................3
    [Show full text]
  • State Spill in Modern Operating Systems
    A Characterization of State Spill in Modern Operating Systems Kevin Boos, Emilio Del Vecchio, and Lin Zhong Rice University fkevinaboos, edd5, [email protected] Abstract states change and propagate throughout the system, showing that modularity is necessary but insufficient. For example, Understanding and managing the propagation of states in several process migration works have cited “residual depen- operating systems has become an intractable problem due dencies” that remain on the source system as an obstacle to to their sheer size and complexity. Despite modularization post-migration correctness on the target system [38, 55, 34]. efforts, it remains a significant barrier to many contemporary Fault isolation and fault tolerance literature has long realized computing goals: process migration, fault isolation and the undesirable effects of fate sharing among software mod- tolerance, live update, software virtualization, and more. ules as well as the difficulty of restoring a process or whole Though many previous OS research endeavors have achieved machine statefully after a failure, due to the sprawl of states these goals through ad-hoc, tedious methods, we argue that spread among different system components [28, 26, 52, 51]. they have missed the underlying reason why these goals are Live update and hot-swapping research has long sought to overcome the state maintenance issues and inter-module de- so challenging: state spill. pendencies that plague their implementations when transi- State spill occurs when a software entity’s state undergoes tioning from an old to a new version, forcing developers to lasting changes as a result of a transaction from another entity. write complex state transfer functions [7, 25, 27, 48, 5].
    [Show full text]
  • Differentiating Communication Styles of Leaders on the Linux Kernel
    Differentiating Communication Styles of Leaders on the Linux Kernel Mailing List Daniel Schneider Scott Spurlock Megan Squire Elon University Elon University Elon University Department of Computing Sciences Department of Computing Sciences Department of Computing Sciences [email protected] [email protected] [email protected] ABSTRACT "maintainers." These maintainers are in charge of reviewing Much communication between developers of free, libre, and open suggested code fixes, or patches, for the different pieces of the source software (FLOSS) projects happens on email mailing lists. core Linux operating system [1]. To preserve a transparent, Geographically and temporally dispersed development teams use archived history of discussions and decisions relating to the email as an asynchronous, centralized, persistently stored project, the entire team - including all developers and interested institutional memory for sharing code samples, discussing bugs, users - uses email mailing lists to communicate. As of this writing and making decisions. Email is especially important to large, there are 148 different mailing lists associated with the core Linux mature projects, such as the Linux kernel, which has thousands of operating system [2]. The Linux Kernel Mailing List (LKML) is developers and a multi-layered leadership structure. In this paper, one of those 148 lists. With over 7000 subscribers sending nearly we collect and analyze data to understand the communication 300 messages per day, it is a very active community. This mailing patterns in such a community. How do the leaders of the Linux list has been in use for over 20 years, and includes over 2.16 Kernel project write in email? What are the salient features of million emails from approximately 54,000 senders.
    [Show full text]