You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 226 Next »

Input/Output is a broad topic and includes all the functions defined in C99 [[ISO/IEC 9899-1999]] Section 7.19, "Input/output <stdio.h>" and related functions.

The security of I/O operations is dependent on the versions of the C library, the operating system, and the file system. Older libraries are generally more susceptible to security flaws than newer library versions. Different operating systems have different capabilities and mechanisms for managing file privileges. There are numerous different file systems, including: File Allocation Table (FAT), FAT32, New Technology File System (NTFS), NetWare File System (NWFS), and the Unix File System (UFS). There are also many distributed file systems including: Andrew File System (AFS), Distributed File System (DFS), Microsoft DFS, and Network File System (NFS). These file systems vary in their capabilities and privilege mechanisms.

As a starting point, the I/O topic area describes the use of C99 standard functions. However, because these functions have been generalized to support multiple disparate operating and file systems, they cannot generally be used in a secure fashion. As a result, most of the rules and recommendations in this topic area recommend approaches that are specific to the operating system and file systems in use. Because of the inherent complexity, there may not exist compliant solutions for all operating system and file system combinations. Consequently, you must consider the target operating and file systems when evaluating the applicability of each compliant solution to your environment.

Recommendations

FIO00-A. Take care when creating format strings

FIO01-A. Be careful using functions that use file names for identification

FIO02-A. Canonicalize path names originating from untrusted sources

FIO03-A. Do not make assumptions about fopen() and file creation

FIO04-A. Detect and handle input and output errors

FIO05-A. Identify files using multiple file attributes

FIO06-A. Create files with appropriate access permissions

FIO07-A. Prefer fseek() to rewind()

FIO08-A. Take care when calling remove() on an open file

FIO09-A. Be careful with binary data when transferring data across systems

FIO10-A. Take care when using the rename() function

FIO11-A. Take care when specifying the mode parameter of fopen()

FIO12-A. Prefer setvbuf() to setbuf()

FIO13-A. Take care when using ungetc()

FIO14-A. Understand the difference between text mode and binary mode with file streams

FIO15-A. Do not create temporary files in shared directories

Rules

FIO30-C. Exclude user input from format strings

FIO31-C. Do not simultaneously open the same file multiple times

FIO32-C. Do not perform operations on devices that are only appropriate for files

FIO33-C. Detect and handle input output errors resulting in undefined behavior

FIO34-C. Use int to capture the return value of character IO functions

FIO35-C. Use feof() and ferror() to detect end-of-file and file errors when sizeof(int) == sizeof(char)

FIO36-C. Do not assume a newline character is read when using fgets()

FIO37-C. Don't assume character data has been read

FIO38-C. Do not use a copy of a FILE object for input and output

FIO39-C. Do not read in from a stream directly following output to that stream

FIO40-C. Reset strings on fgets() failure

FIO41-C. Do not call getc() or putc() with stream arguments that have side effects

FIO42-C. Ensure files are properly closed when they are no longer needed

FIO43-C. Do not copy data from an unbounded source to a fixed-length array

FIO44-C. Only use values for fsetpos() that are returned from fgetpos()

FIO45-C. Do not reopen a file stream

FIO46-C. Temporary files must be dealt with in a secure manner

Risk Assessment Summary

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

FIO00-A

low

unlikely

medium

P2

L3

FIO01-A

medium

probable

high

P4

L3

FIO02-A

medium

unlikely

high

P2

L3

FIO03-A

medium

probable

high

P4

L3

FIO04-A

medium

probable

high

P4

L3

FIO05-A

medium

probable

medium

P8

L2

FIO06-A

medium

unlikely

medium

P4

L3

FIO07-A

low

unlikely

medium

P2

L3

FIO08-A

medium

unlikely

medium

P4

L3

FIO09-A

low

unlikely

medium

P2

L3

FIO10-A

medium

probable

medium

P8

L2

FIO11-A

low

probable

low

P6

L2

FIO12-A

low

unlikely

medium

P2

L3

FIO13-A

medium

probable

high

P4

L3

FIO14-A

low

probable

medium

P4

L3

FIO15-A

high

probable

high

P6

L2

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

FIO30-C

high

likely

low

P27

L1

FIO31-C

medium

probable

medium

P8

L2

FIO32-C

medium

unlikely

medium

P4

L3

FIO33-C

high

unlikely

medium

P6

L2

FIO34-C

high

probable

medium

P12

L1

FIO35-C

low

unlikely

medium

P2

L3

FIO36-C

medium

unlikely

low

P6

L2

FIO37-C

high

unlikely

medium

P6

L2

FIO38-C

low

probable

medium

P4

L3

FIO39-C

medium

probable

medium

P8

L2

FIO40-C

low

unlikely

medium

P2

L3

FIO41-C

low

unlikely

medium

P2

L3

FIO42-C

medium

unlikely

medium

P4

L3

FIO43-C

high

likely

medium

P18

L1

FIO44-C

medium

unlikely

medium

P4

L3

FIO45-C

medium

unlikely

medium

P4

L3

FIO46-C

high

probable

high

P6

L2

Related Rules and Recommendations


      08. Memory Management (MEM)       FIO00-A. Take care when creating format strings

  • No labels