diff options
| author | jvoisin | 2023-08-20 18:25:12 +0200 |
|---|---|---|
| committer | jvoisin | 2023-08-20 20:51:19 +0200 |
| commit | 70bbb621b5bad33b03053264abc6deb0c6c5525e (patch) | |
| tree | cf8dd99490b5be90fef7ebb98323e19f561bb57a /README.md | |
| parent | e182dd0138d8040c44481a48277cab4098ccca0a (diff) | |
Refresh a bit the README
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..ba5d6ec --- /dev/null +++ b/README.md | |||
| @@ -0,0 +1,115 @@ | |||
| 1 | # What is it? | ||
| 2 | |||
| 3 | This is a standalone implementation of | ||
| 4 | [fortify source]( http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html ) | ||
| 5 | based on [the one](https://git.2f30.org/fortify-headers/) from | ||
| 6 | [sin](https://u.2f30.org/sin/). It provides compile time buffer checks. | ||
| 7 | It is libc-agnostic and simply overlays the system headers by using the | ||
| 8 | [`#include_next`](https://gcc.gnu.org/onlinedocs/cpp/Wrapper-Headers.html) | ||
| 9 | extension found in GCC, and | ||
| 10 | [black magic](https://github.com/jvoisin/fortify-headers/commit/fe149628eaae9748be08815d726cc56e8e492c73) | ||
| 11 | on Clang. It was initially intended to be used on | ||
| 12 | [musl](http://www.musl-libc.org/) based | ||
| 13 | [Linux distributions](https://git.alpinelinux.org/aports/commit/?id=067a4f28825478911bb62be3b8da758d9722753e). | ||
| 14 | |||
| 15 | |||
| 16 | # Features | ||
| 17 | |||
| 18 | - It is portable, works on *BSD, Linux, Solaris and possibly others. | ||
| 19 | - It will only trap non-conformant programs. This means that fortify | ||
| 20 | level 2 is treated in the same way as level 1. | ||
| 21 | - Avoids making function calls when undefined behaviour has already been | ||
| 22 | invoked. This is handled by using `__builtin_trap()`. | ||
| 23 | - Support for out-of-bounds read interfaces, such as send(), write(), | ||
| 24 | fwrite() etc. | ||
| 25 | - No ABI is enforced. All of the fortify check functions are inlined | ||
| 26 | into the resulting binary. | ||
| 27 | - It has a [comprehensive suite of tests](https://github.com/jvoisin/fortify-headers/tree/master/tests), | ||
| 28 | running both on Clang and on GCC for every commit, with | ||
| 29 | [significant coverage](https://jvoisin.github.io/fortify-headers/) | ||
| 30 | |||
| 31 | |||
| 32 | # Sample usage | ||
| 33 | |||
| 34 | If you want to quickly test it, you can try something like the following: | ||
| 35 | |||
| 36 | ``` | ||
| 37 | cat > fgets.c <<EOF | ||
| 38 | #include <stdio.h> | ||
| 39 | int | ||
| 40 | main(void) | ||
| 41 | { | ||
| 42 | char buf[BUFSIZ]; | ||
| 43 | fgets(buf, sizeof(buf) + 1, stdin); | ||
| 44 | return 0; | ||
| 45 | } | ||
| 46 | EOF | ||
| 47 | cc -I<path-to-fortify-include-dir> -D_FORTIFY_SOURCE=1 -O1 fgets.c | ||
| 48 | ./a.out | ||
| 49 | ``` | ||
| 50 | |||
| 51 | At this point, the program will safely crash. | ||
| 52 | |||
| 53 | |||
| 54 | # Supported interfaces | ||
| 55 | |||
| 56 | - `FD_CLR` | ||
| 57 | - `FD_SET` | ||
| 58 | - `bcopy` | ||
| 59 | - `bzero` | ||
| 60 | - `confstr` | ||
| 61 | - `fgets` | ||
| 62 | - `fgetws` | ||
| 63 | - `fread` | ||
| 64 | - `fwrite` | ||
| 65 | - `getcwd` | ||
| 66 | - `getdomainname` | ||
| 67 | - `getgroups` | ||
| 68 | - `gethostname` | ||
| 69 | - `getlogin_r` | ||
| 70 | - `mbsnrtowcs` | ||
| 71 | - `mbsrtowcs` | ||
| 72 | - `mbstowcs` | ||
| 73 | - `memcpy` | ||
| 74 | - `memmove` | ||
| 75 | - `mempcpy` | ||
| 76 | - `memset` | ||
| 77 | - `poll` | ||
| 78 | - `ppoll` | ||
| 79 | - `pread` | ||
| 80 | - `read` | ||
| 81 | - `readlink` | ||
| 82 | - `readlinkat` | ||
| 83 | - `realpath` | ||
| 84 | - `recv` | ||
| 85 | - `recvfrom` | ||
| 86 | - `send` | ||
| 87 | - `sendto` | ||
| 88 | - `snprintf` | ||
| 89 | - `sprintf` | ||
| 90 | - `stpcpy` | ||
| 91 | - `stpncpy` | ||
| 92 | - `strcat` | ||
| 93 | - `strchr` | ||
| 94 | - `strcpy` | ||
| 95 | - `strlcat` | ||
| 96 | - `strlcpy` | ||
| 97 | - `strncat` | ||
| 98 | - `strncpy` | ||
| 99 | - `strrchr` | ||
| 100 | - `ttyname_r` | ||
| 101 | - `vsnprintf` | ||
| 102 | - `vsprintf` | ||
| 103 | - `wcrtomb` | ||
| 104 | - `wcscat` | ||
| 105 | - `wcscpy` | ||
| 106 | - `wcsncat` | ||
| 107 | - `wcsncpy` | ||
| 108 | - `wcsnrtombs` | ||
| 109 | - `wcsrtombs` | ||
| 110 | - `wcstombs` | ||
| 111 | - `wctomb` | ||
| 112 | - `wmemcpy` | ||
| 113 | - `wmemmove` | ||
| 114 | - `wmemset` | ||
| 115 | - `write` | ||
