Gentoo Archives: gentoo-commits

From: "Anthony G. Basile" <blueness@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/elfix:master commit in: src/, /, poc/
Date: Sat, 07 May 2011 02:21:16
Message-Id: e6797b5c11034d79c4e59f659736bfe288104c66.blueness@gentoo
1 commit: e6797b5c11034d79c4e59f659736bfe288104c66
2 Author: Anthony G. Basile <basile <AT> opensource <DOT> dyc <DOT> edu>
3 AuthorDate: Sat May 7 02:21:00 2011 +0000
4 Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
5 CommitDate: Sat May 7 02:21:00 2011 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=e6797b5c
7
8 poc/mangle-paxflags.c: added quiet mode and fixed whitespaces
9
10 ---
11 configure.ac | 1 +
12 poc/mangle-paxflags.c | 210 +++++++++++++++++++++++++++----------------------
13 src/fix-gnustack.c | 4 +-
14 src/paxctl-ng.c | 23 +++---
15 4 files changed, 132 insertions(+), 106 deletions(-)
16
17 diff --git a/configure.ac b/configure.ac
18 index 15ffc03..e082850 100644
19 --- a/configure.ac
20 +++ b/configure.ac
21 @@ -47,6 +47,7 @@ AC_CHECK_HEADERS([errno.h])
22 AC_CHECK_HEADERS([error.h])
23 AC_CHECK_HEADERS([fcntl.h])
24 AC_CHECK_HEADERS([gelf.h])
25 +AC_CHECK_HEADERS([libgen.h])
26 AC_CHECK_HEADERS([stdio.h])
27 AC_CHECK_HEADERS([stdlib.h])
28 AC_CHECK_HEADERS([string.h])
29
30 diff --git a/poc/mangle-paxflags.c b/poc/mangle-paxflags.c
31 index 530411c..402fb67 100644
32 --- a/poc/mangle-paxflags.c
33 +++ b/poc/mangle-paxflags.c
34 @@ -20,6 +20,7 @@
35 #include <stdlib.h>
36 #include <string.h>
37 #include <error.h>
38 +#include <libgen.h>
39
40 #include <gelf.h>
41
42 @@ -28,16 +29,17 @@
43 #include <fcntl.h>
44 #include <unistd.h>
45
46 +
47 #include <config.h>
48
49 // From chpax.h
50 #define EI_PAX 14 // Index in e_ident[] where to read flags
51 -#define HF_PAX_PAGEEXEC 1 // 0: Paging based non-exec pages
52 -#define HF_PAX_EMUTRAMP 2 // 0: Emulate trampolines
53 -#define HF_PAX_MPROTECT 4 // 0: Restrict mprotect()
54 -#define HF_PAX_RANDMMAP 8 // 0: Randomize mmap() base
55 -#define HF_PAX_RANDEXEC 16 // 1: Randomize ET_EXEC base
56 -#define HF_PAX_SEGMEXEC 32 // 0: Segmentation based non-exec pages
57 +#define HF_PAX_PAGEEXEC 1 // 0: Paging based non-exec pages
58 +#define HF_PAX_EMUTRAMP 2 // 0: Emulate trampolines
59 +#define HF_PAX_MPROTECT 4 // 0: Restrict mprotect()
60 +#define HF_PAX_RANDMMAP 8 // 0: Randomize mmap() base
61 +#define HF_PAX_RANDEXEC 16 // 1: Randomize ET_EXEC base
62 +#define HF_PAX_SEGMEXEC 32 // 0: Segmentation based non-exec pages
63
64 #define PRINT(E,F,I) printf("%s:\t%s\n", #E, E&F? (I? "enabled" : "disabled") : (I? "disabled" : "enabled"));
65 #define SPRINT(E,F,A,B) printf("%c", E&F? A : B);
66 @@ -48,36 +50,40 @@
67 void
68 print_help(char *v)
69 {
70 - printf(
71 - "Package Name : " PACKAGE_STRING "\n"
72 - "Bug Reports : " PACKAGE_BUGREPORT "\n"
73 - "Description : Check for, or conditionally remove, executable flag from PT_GNU_STACK\n\n"
74 - "Usage : %s {[-e] [-p] ELFfile | -h}\n"
75 - "options : Print out EI_PAX and PT_PAX_FLAGS information\n"
76 - " : -e Set all EI_PAX flags to least secure setting, pEmrXs\n"
77 - " : -p Remove PT_PAX_FLAGS program header\n"
78 + printf(
79 + "Package Name : " PACKAGE_STRING "\n"
80 + "Bug Reports : " PACKAGE_BUGREPORT "\n"
81 + "Program Name : %s\n"
82 + "Description : Check for, or conditionally remove, executable flag from PT_GNU_STACK\n\n"
83 + "Usage : %s {[-e] [-p] [-v] [-q] ELFfile | [-h]}\n"
84 + "options : Print out EI_PAX and PT_PAX_FLAGS information\n"
85 + " : -e Set all EI_PAX flags to least secure setting, pEmrXs\n"
86 + " : -p Remove PT_PAX_FLAGS program header\n"
87 " : -v Verbose expanation of flags (rather than short list)\n"
88 - " : -h Print out this help\n",
89 - v
90 - );
91 + " : -q Surpress all output to stdout (negates verbose)\n"
92 + " : -h Print out this help\n",
93 + basename(v),
94 + basename(v)
95 + );
96
97 - exit(EXIT_SUCCESS);
98 + exit(EXIT_SUCCESS);
99 }
100
101
102 char *
103 -parse_cmd_args(int c, char *v[], int *flag_ei_pax, int *flag_pt_pax_flags, int *verbose)
104 +parse_cmd_args(int c, char *v[], int *flag_ei_pax, int *flag_pt_pax_flags, int *verbose, int *quiet)
105 {
106 int i, oc;
107
108 if((c != 2)&&(c != 3)&&(c != 4))
109 - error(EXIT_FAILURE, 0, "Usage: %s {[-e] [-p] [-v] ELFfile | [-h]}", v[0]);
110 + error(EXIT_FAILURE, 0, "Usage: %s {[-e] [-p] [-v] [-q] ELFfile | [-h]}", v[0]);
111
112 *flag_ei_pax = 0;
113 *flag_pt_pax_flags = 0;
114 *verbose = 0;
115 + *quiet = 0;
116
117 - while((oc = getopt(c, v,":epvh")) != -1)
118 + while((oc = getopt(c, v,":epvqh")) != -1)
119 switch(oc)
120 {
121 case 'e':
122 @@ -89,6 +95,9 @@ parse_cmd_args(int c, char *v[], int *flag_ei_pax, int *flag_pt_pax_flags, int *
123 case 'v':
124 *verbose = 1;
125 break;
126 + case 'q':
127 + *quiet = 1;
128 + break;
129 case 'h':
130 print_help(v[0]);
131 break;
132 @@ -104,7 +113,8 @@ parse_cmd_args(int c, char *v[], int *flag_ei_pax, int *flag_pt_pax_flags, int *
133 int
134 main( int argc, char *argv[])
135 {
136 - int fd, flag_ei_pax, flag_pt_pax_flags, verbose, found_ei_pax;
137 + int fd, found_ei_pax;
138 + int flag_ei_pax, flag_pt_pax_flags, verbose, quiet;
139 char *f_name;
140 size_t i, phnum;
141
142 @@ -112,7 +122,7 @@ main( int argc, char *argv[])
143 GElf_Ehdr ehdr;
144 GElf_Phdr phdr;
145
146 - f_name = parse_cmd_args(argc, argv, &flag_ei_pax, &flag_pt_pax_flags, &verbose);
147 + f_name = parse_cmd_args(argc, argv, &flag_ei_pax, &flag_pt_pax_flags, &verbose, &quiet);
148
149 if(elf_version(EV_CURRENT) == EV_NONE)
150 error(EXIT_FAILURE, 0, "Library out of date.");
151 @@ -140,110 +150,120 @@ main( int argc, char *argv[])
152
153 found_ei_pax = ((u_long) ehdr.e_ident[EI_PAX + 1] << 8) + (u_long) ehdr.e_ident[EI_PAX];
154
155 - printf("==== EI_PAX ====\n") ;
156 - if(verbose)
157 - {
158 - PRINT(HF_PAX_PAGEEXEC, found_ei_pax, 0);
159 - PRINT(HF_PAX_EMUTRAMP, found_ei_pax, 1);
160 - PRINT(HF_PAX_MPROTECT, found_ei_pax, 0);
161 - PRINT(HF_PAX_RANDMMAP, found_ei_pax, 0);
162 - PRINT(HF_PAX_RANDEXEC, found_ei_pax, 1);
163 - PRINT(HF_PAX_SEGMEXEC, found_ei_pax, 0);
164 - printf("\n");
165 - }
166 - else
167 + if(!quiet)
168 {
169 - SPRINT(HF_PAX_PAGEEXEC, found_ei_pax, 'p', 'P');
170 - SPRINT(HF_PAX_EMUTRAMP, found_ei_pax, 'E', 'e');
171 - SPRINT(HF_PAX_MPROTECT, found_ei_pax, 'm', 'M');
172 - SPRINT(HF_PAX_RANDMMAP, found_ei_pax, 'r', 'R');
173 - SPRINT(HF_PAX_RANDEXEC, found_ei_pax, 'X', 'x');
174 - SPRINT(HF_PAX_SEGMEXEC, found_ei_pax, 's', 'S');
175 - printf("\n\n");
176 + printf("==== EI_PAX ====\n") ;
177 + if(verbose)
178 + {
179 + PRINT(HF_PAX_PAGEEXEC, found_ei_pax, 0);
180 + PRINT(HF_PAX_EMUTRAMP, found_ei_pax, 1);
181 + PRINT(HF_PAX_MPROTECT, found_ei_pax, 0);
182 + PRINT(HF_PAX_RANDMMAP, found_ei_pax, 0);
183 + PRINT(HF_PAX_RANDEXEC, found_ei_pax, 1);
184 + PRINT(HF_PAX_SEGMEXEC, found_ei_pax, 0);
185 + printf("\n");
186 + }
187 + else
188 + {
189 + SPRINT(HF_PAX_PAGEEXEC, found_ei_pax, 'p', 'P');
190 + SPRINT(HF_PAX_EMUTRAMP, found_ei_pax, 'E', 'e');
191 + SPRINT(HF_PAX_MPROTECT, found_ei_pax, 'm', 'M');
192 + SPRINT(HF_PAX_RANDMMAP, found_ei_pax, 'r', 'R');
193 + SPRINT(HF_PAX_RANDEXEC, found_ei_pax, 'X', 'x');
194 + SPRINT(HF_PAX_SEGMEXEC, found_ei_pax, 's', 'S');
195 + printf("\n\n");
196 + }
197 }
198
199 if( flag_ei_pax )
200 {
201 - printf("Disabling EI_PAX\n\n");
202 + if(!quiet)
203 + printf("Disabling EI_PAX\n\n");
204 ehdr.e_ident[EI_PAX] = 0xFF;
205 ehdr.e_ident[EI_PAX + 1] = 0xFF;
206 if(!gelf_update_ehdr(elf, &ehdr))
207 error(EXIT_FAILURE, 0, "gelf_update_ehdr(): %s", elf_errmsg(elf_errno()));
208 }
209
210 - printf("==== PHRDs ====\n") ;
211 + if(!quiet)
212 + printf("==== PHRDs ====\n") ;
213 elf_getphdrnum(elf, &phnum);
214 for(i=0; i<phnum; ++i)
215 {
216 if(gelf_getphdr(elf, i, &phdr) != &phdr)
217 error(EXIT_FAILURE, 0, "gelf_getphdr(): %s", elf_errmsg(elf_errno()));
218
219 - if(verbose)
220 - {
221 - switch(phdr.p_type)
222 - {
223 - CPRINT(i,PT_NULL);
224 - CPRINT(i,PT_LOAD);
225 - CPRINT(i,PT_DYNAMIC);
226 - CPRINT(i,PT_INTERP);
227 - CPRINT(i,PT_NOTE);
228 - CPRINT(i,PT_SHLIB);
229 - CPRINT(i,PT_PHDR);
230 - CPRINT(i,PT_TLS);
231 - CPRINT(i,PT_NUM);
232 - CPRINT(i,PT_LOOS);
233 - CPRINT(i,PT_GNU_EH_FRAME);
234 - CPRINT(i,PT_GNU_STACK);
235 - CPRINT(i,PT_GNU_RELRO);
236 - CPRINT(i,PT_PAX_FLAGS);
237 - CPRINT(i,PT_LOSUNW);
238 - //CPRINT(i,PT_SUNWBSS);
239 - CPRINT(i,PT_SUNWSTACK);
240 - CPRINT(i,PT_HISUNW);
241 - //CPRINT(i,PT_HIOS);
242 - CPRINT(i,PT_LOPROC);
243 - CPRINT(i,PT_HIPROC);
244 - }
245 - }
246 -
247 - if(phdr.p_type == PT_PAX_FLAGS)
248 + if(!quiet)
249 {
250 if(verbose)
251 {
252 - PRINT(PF_PAGEEXEC, phdr.p_flags, 1);
253 - PRINT(PF_NOPAGEEXEC, phdr.p_flags, 1);
254 - PRINT(PF_SEGMEXEC, phdr.p_flags, 1);
255 - PRINT(PF_NOSEGMEXEC, phdr.p_flags, 1);
256 - PRINT(PF_MPROTECT, phdr.p_flags, 1);
257 - PRINT(PF_NOMPROTECT, phdr.p_flags, 1);
258 - PRINT(PF_RANDEXEC, phdr.p_flags, 1);
259 - PRINT(PF_NORANDEXEC, phdr.p_flags, 1);
260 - PRINT(PF_EMUTRAMP, phdr.p_flags, 1);
261 - PRINT(PF_NOEMUTRAMP, phdr.p_flags, 1);
262 - PRINT(PF_RANDMMAP, phdr.p_flags, 1);
263 - PRINT(PF_NORANDMMAP, phdr.p_flags, 1);
264 + switch(phdr.p_type)
265 + {
266 + CPRINT(i,PT_NULL);
267 + CPRINT(i,PT_LOAD);
268 + CPRINT(i,PT_DYNAMIC);
269 + CPRINT(i,PT_INTERP);
270 + CPRINT(i,PT_NOTE);
271 + CPRINT(i,PT_SHLIB);
272 + CPRINT(i,PT_PHDR);
273 + CPRINT(i,PT_TLS);
274 + CPRINT(i,PT_NUM);
275 + CPRINT(i,PT_LOOS);
276 + CPRINT(i,PT_GNU_EH_FRAME);
277 + CPRINT(i,PT_GNU_STACK);
278 + CPRINT(i,PT_GNU_RELRO);
279 + CPRINT(i,PT_PAX_FLAGS);
280 + CPRINT(i,PT_LOSUNW);
281 + //CPRINT(i,PT_SUNWBSS);
282 + CPRINT(i,PT_SUNWSTACK);
283 + CPRINT(i,PT_HISUNW);
284 + //CPRINT(i,PT_HIOS);
285 + CPRINT(i,PT_LOPROC);
286 + CPRINT(i,PT_HIPROC);
287 + }
288 }
289 - else
290 +
291 + if(phdr.p_type == PT_PAX_FLAGS)
292 {
293 - printf("%d: PT_PAX_FLAGS\n", (int)i);
294 - FPRINT(PF_PAGEEXEC, PF_NOPAGEEXEC, phdr.p_flags, 'p', 'P');
295 - FPRINT(PF_EMUTRAMP, PF_NOEMUTRAMP, phdr.p_flags, 'e', 'E');
296 - FPRINT(PF_MPROTECT, PF_NOMPROTECT, phdr.p_flags, 'm', 'M');
297 - FPRINT(PF_RANDMMAP, PF_NORANDMMAP, phdr.p_flags, 'r', 'R');
298 - FPRINT(PF_RANDEXEC, PF_NORANDEXEC, phdr.p_flags, 'x', 'X');
299 - FPRINT(PF_SEGMEXEC, PF_NOSEGMEXEC, phdr.p_flags, 's', 'S');
300 + if(verbose)
301 + {
302 + PRINT(PF_PAGEEXEC, phdr.p_flags, 1);
303 + PRINT(PF_NOPAGEEXEC, phdr.p_flags, 1);
304 + PRINT(PF_SEGMEXEC, phdr.p_flags, 1);
305 + PRINT(PF_NOSEGMEXEC, phdr.p_flags, 1);
306 + PRINT(PF_MPROTECT, phdr.p_flags, 1);
307 + PRINT(PF_NOMPROTECT, phdr.p_flags, 1);
308 + PRINT(PF_RANDEXEC, phdr.p_flags, 1);
309 + PRINT(PF_NORANDEXEC, phdr.p_flags, 1);
310 + PRINT(PF_EMUTRAMP, phdr.p_flags, 1);
311 + PRINT(PF_NOEMUTRAMP, phdr.p_flags, 1);
312 + PRINT(PF_RANDMMAP, phdr.p_flags, 1);
313 + PRINT(PF_NORANDMMAP, phdr.p_flags, 1);
314 + }
315 + else
316 + {
317 + printf("%d: PT_PAX_FLAGS\n", (int)i);
318 + FPRINT(PF_PAGEEXEC, PF_NOPAGEEXEC, phdr.p_flags, 'p', 'P');
319 + FPRINT(PF_EMUTRAMP, PF_NOEMUTRAMP, phdr.p_flags, 'e', 'E');
320 + FPRINT(PF_MPROTECT, PF_NOMPROTECT, phdr.p_flags, 'm', 'M');
321 + FPRINT(PF_RANDMMAP, PF_NORANDMMAP, phdr.p_flags, 'r', 'R');
322 + FPRINT(PF_RANDEXEC, PF_NORANDEXEC, phdr.p_flags, 'x', 'X');
323 + FPRINT(PF_SEGMEXEC, PF_NOSEGMEXEC, phdr.p_flags, 's', 'S');
324 + }
325 }
326 }
327
328 if((phdr.p_type == PT_PAX_FLAGS) && flag_pt_pax_flags )
329 {
330 - printf("CONVERTED -> PT_NULL\n\n");
331 + if(!quiet)
332 + printf("CONVERTED -> PT_NULL\n\n");
333 phdr.p_type = PT_NULL;
334 if(!gelf_update_phdr(elf, i, &phdr))
335 error(EXIT_FAILURE, 0, "gelf_update_phdr(): %s", elf_errmsg(elf_errno()));
336 }
337 }
338 - printf("\n\n");
339 + if(!quiet)
340 + printf("\n\n");
341
342 elf_end(elf);
343 close(fd);
344
345 diff --git a/src/fix-gnustack.c b/src/fix-gnustack.c
346 index 2afd7da..3c12700 100644
347 --- a/src/fix-gnustack.c
348 +++ b/src/fix-gnustack.c
349 @@ -20,6 +20,7 @@
350 #include <stdlib.h>
351 #include <string.h>
352 #include <error.h>
353 +#include <libgen.h>
354
355 #include <gelf.h>
356
357 @@ -37,12 +38,13 @@ print_help(char *v)
358 printf(
359 "Package Name : " PACKAGE_STRING "\n"
360 "Bug Reports : " PACKAGE_BUGREPORT "\n"
361 + "Program Name : %s\n"
362 "Description : Check for, or conditionally remove, executable flag from PT_GNU_STACK\n\n"
363 "Usage : %s {[-f] ELFfile | [-h]}\n"
364 "options : Print out protection flags on PT_GNU_STACK\n"
365 " : -f Remove X if WX flags are set on PT_GNU_STACK\n"
366 " : -h Print out this help\n",
367 - v
368 + basename(v), basename(v)
369 );
370
371 exit(EXIT_SUCCESS);
372
373 diff --git a/src/paxctl-ng.c b/src/paxctl-ng.c
374 index 9f1b86a..0957e36 100644
375 --- a/src/paxctl-ng.c
376 +++ b/src/paxctl-ng.c
377 @@ -20,6 +20,7 @@
378 #include <stdlib.h>
379 #include <string.h>
380 #include <error.h>
381 +#include <libgen.h>
382
383 #include <gelf.h>
384
385 @@ -39,12 +40,13 @@
386 void
387 print_help(char *v)
388 {
389 - printf(
390 - "Package Name : " PACKAGE_STRING "\n"
391 - "Bug Reports : " PACKAGE_BUGREPORT "\n"
392 - "Description : Get or set pax flags on an ELF object\n\n"
393 - "Usage : %s {[-pPeEmMrRxXsSzZC] ELFfile | [-h]}\n"
394 - "options : Print out pax flag information\n"
395 + printf(
396 + "Package Name : " PACKAGE_STRING "\n"
397 + "Bug Reports : " PACKAGE_BUGREPORT "\n"
398 + "Program Name : %s\n"
399 + "Description : Get or set pax flags on an ELF object\n\n"
400 + "Usage : %s {[-pPeEmMrRxXsSzZC] ELFfile | [-h]}\n"
401 + "options : Print out pax flag information\n"
402 " : -p Disable PAGEEXEC\t-P Enable PAGEEXEC\n"
403 " : -e Disable EMUTRAMP\t-E Enable EMUTRAMP\n"
404 " : -m Disable MPROTECT\t-M Enable MPROTECT\n"
405 @@ -53,11 +55,12 @@ print_help(char *v)
406 " : -s Disable SEGMEXEC\t-X Enable SEGMEXEC\n"
407 " : -z Default least secure\t-Z Default most secure\n"
408 " : -C Created PT_PAX_FLAGS program header\n"
409 - " : -h Print out this help\n",
410 - v
411 - );
412 + " : -h Print out this help\n",
413 + basename(v),
414 + basename(v)
415 + );
416
417 - exit(EXIT_SUCCESS);
418 + exit(EXIT_SUCCESS);
419 }