.\" dpkg manual page - dpkg-buildflags(1) .\" .\" Copyright Š 2010-2011 RaphaĂŤl Hertzog .\" Copyright Š 2011 Kees Cook .\" .\" This is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 2 of the License, or .\" (at your option) any later version. .\" .\" This is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see . . .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH dpkg\-buildflags 1 2012\-04\-03 "Projekt Debian" "użytki dpkg" .SH NAZWA dpkg\-buildflags \- zwraca flagi budowania używane podczas budowania pakietu . .SH SKŁADNIA \fBdpkg\-buildflags\fP [\fIopcja\fP...] [\fIpolecenie\fP] . .SH OPIS \fBdpkg\-buildflags\fP jest narzędziem do pozyskiwania flag kompilacji do użycia podczas budowania pakietów Debiana. . Domyślne flagi są definiowane przez dostawcę, ale mogą zostać rozszerzone/przesłonięte na wiele sposobów: .IP 1. systemowo, używając \fB/etc/dpkg/buildflags.conf\fP; .IP 2. dla bieżącego użytkownika \fB$XDG_CONFIG_HOME/dpkg/buildflags.conf\fP, gdzie \fB$XDG_CONFIG_HOME\fP domyślnie jest \fB$HOME/.config\fP; .IP 3. tymczasowo przez użytkownika za pomocą zmiennych środowiskowych (patrz \fBZMIENNE ŚRODOWISKA\fP). .IP 4. dynamicznie przez opiekuna pakietu za pomocą zmiennych środowiskowych ustawianych poprzez \fBdebian/rules\fP (patrz \fBZMIENNE ŚRODOWISKA\fP). .P Pliki konfiguracyjne mogą zawierać dwa typy dyrektyw: .TP \fBSET\fP\fI wartość flaga\fP Przesłania flagę \fIflaga\fP tak, aby miała wartość \fIwartość\fP. .TP \fBSTRIP\fP\fI flaga wartość\fP Usuwa z flagi \fIflaga\fP wszystkie flagi budowania umieszczone w \fIwartości\fP. .TP \fBAPPEND\fP\fI flaga wartość\fP Rozszerza flagę \fIflaga\fP dodając opcje podane w \fIwartości\fP. Do dodawanych wartości na początku dodawana jest spacja, jeśli bieżąca wartość flagi nie jest pusta. .TP \fBPREPEND\fP\fI flaga wartość\fP Rozszerza flagę \fIflaga\fP przez dopisanie przed nią opcji podanej w \fIwartości\fP. Do dopisywanej opcji jest dopisywana spacja, jeśli bieżąca wartość flagi nie jest pusta. .P Pliki konfiguracyjne mogą zawierać komentarze w wierszach zaczynających się kratką (#). Ignorowane są również puste wiersze. .SH POLECENIA .TP \fB\-\-dump\fP Wypisuje na standardowe wyjście wszystkie flagi kompilacji i ich wartości. Wyświetla po jednej fladze na wiersz, oddzielając ją od jej wartości znakiem równości ("\fIflaga\fP=\fIwartość\fP"). Jest to działanie domyślne. .TP \fB\-\-list\fP Wypisuje listę flag obsługiwanych przez bieżącego dostawce (po jednym na wiersz). Rozdział \fBOBSŁUGIWANE FLAGI\fP zawiera o nich więcej informacji. .TP \fB\-\-status\fP Wyświetla informacje, które mogą okazać się przydatne do wyjaśnienia zachowania \fBdpkg\-buildflags\fP: powiązane zmienne środowiskowe, obecny dostawca, stan wszystkich flag funkcyjnych. Wypisywane są również wynikowe flagi kompilatora, razem z ich pochodzeniem. Jest to przeznaczone do uruchamiania z \fBdebian/rules\fP, dzięki czemu log budowania przechowuje jasny zapis użytych flag budowania. Może okazać się to przydatne do diagnozowania związanych z nimi problemów. .TP \fB\-\-export=\fP\fIformat\fP Wypisuje na standardowe wyjście powłoki (jeśli \fIformatem\fP jest \fBsh\fP) lub make (jeśli \fIformatem\fP jest \fBmake\fP) polecenia, które mogą być użyte do wyeksportowania wszystkich flag kompilacji w środowisku. Jeśli \fIformatem\fP jest \fBconfigure\fP, to wyjście może być użyte w wierszu poleceń \&\fB./configure\fP. Jeśli wartość \fIformat\fP nie została podana, przyjmowane jest \fBsh\fP. Załączone są jedynie flagi kompilacji zaczynające się od wielkiej litery, inne są przyjmowane za nienadające się do środowiska. .TP \fB\-\-get\fP\fI flaga\fP Wypisuje wartość flagi na standardowe wyjście. Wychodzi z 0, jeśli flaga jest znana, w przeciwnym wypadku kończy z 1. .TP \fB\-\-origin\fP\fI flaga\fP Wypisuje pochodzenie wartości zwracanej przez \fB\-\-get\fP. Wychodzi z 0 jeśli flaga jest znana, w przeciwnym wypadku z 1. Pochodzenie może mieć następujące wartości: .RS .TP \fBvendor\fP zwracana jest oryginalna flaga ustawiona przez dostawcę, .TP \fBsystem\fP flaga jest ustawiana/modyfikowana przez konfigurację systemową, .TP \fBuser\fP flaga jest ustawiana/modyfikowana przez konfigurację użytkownika, .TP \fBenv\fP flaga jest ustawiana/modyfikowana przez konfigurację środowiskową. .RE .TP \fB\-\-query\-features\fP\fI obszar\fP Wypisuje funkcje włączone w danym obszarze. Jedynym obecnie rozpoznawanym jest \fBhardening\fP. Wychodzi z 0 jeśli obszar jest znany i z 1 w przeciwnym wypadku. .IP Format wyjścia jest nagłówkiem zgodnym z RFC822, z jednym rozdziałem na funkcję. Na przykład: .IP .nf Feature: pie Enabled: no Feature: stackprotector Enabled: yes .fi .TP \fB\-\-help\fP Wyświetla informację o użytkowaniu i kończy działanie. .TP \fB\-\-version\fP Wyświetla informację o wersji i pomyślnie kończy działanie. . .SH "OBSŁUGIWANE FLAGI" .TP \fBCFLAGS\fP Opcje do kompilatora C. Domyślne wartości ustawiane przez dostawcę obejmują \fI\-g\fP i domyślny poziom optymalizacji (zwykle \fI\-O2\fP lub \fI\-O0\fP, jeśli zmienna środowiskowa \fBDEB_BUILD_OPTIONS\fP definiuje \fInoopt\fP). .TP \fBCPPFLAGS\fP Opcje do preprocesora C, Domyślna wartość: pusta. .TP \fBCXXFLAGS\fP Opcje do kompilatora C++. Jak \fBCFLAGS\fP. .TP \fBFFLAGS\fP Opcje do kompilatora Fortran. Jak \fBCFLAGS\fP. .TP \fBLDFLAGS\fP Opcje przekazywane do kompilatora podczas łączenia plików wykonywalnych lub współdzielonych bibliotek (jeśli linker jest wywoływany bezpośrednio, \fB\-Wl\fP i \fB,\fP muszą być usunięte z tych opcji). Wartość domyślna: puste. . .SH PLIKI .TP \fB/etc/dpkg/buildflags.conf\fP Plik konfiguracji ogólnosystemowej. .TP \fB$XDG_CONFIG_HOME/dpkg/buildflags.conf\fP lub \fB$HOME/.config/dpkg/buildflags.conf\fP Plik konfiguracyjny użytkownika. .SH ŚRODOWISKO Są 2 zestawy zmiennych środowiskowych wykonujących te same operacje. Pierwszy (DEB_\fIflaga\fP_\fIop\fP) nie powinien być nigdy używany z \fBdebian/rules\fP. Jest on przeznaczony dla użytkownika, który chciałby przebudować pakiet źródłowy używając innych flag budowania. Drugi zestaw (DEB_\fIflaga\fP_MAINT_\fIop\fP) powinien być używany wyłącznie przez opiekunów pakietów do zmiany wynikowych flag budowania. .TP \fBDEB_\fP\fIflaga\fP\fB_SET\fP .TQ \fBDEB_\fP\fIflaga\fP\fB_MAINT_SET\fP Zmienna może być użyta do wymuszenia wartości zwracanej przez daną \fIflagę\fP. .TP \fBDEB_\fP\fIflaga\fP\fB_STRIP\fP .TQ \fBDEB_\fP\fIflaga\fP\fB_MAINT_STRIP\fP Zmienna może być użyta do udostępnienia listy opcji (oddzielonej spacjami), które zostaną usunięte z zestawu flag zwróconych przez daną \fIflagę\fP .TP \fBDEB_\fP\fIflaga\fP\fB_APPEND\fP .TQ \fBDEB_\fP\fIflaga\fP\fB_MAINT_APPEND\fP Zmienna może być użyta do dodania (za) opcji uzupełniających do wartości zwróconej przez daną \fIflagę\fP. .TP \fBDEB_\fP\fIflaga\fP\fB_PREPEND\fP .TQ \fBDEB_\fP\fIflaga\fP\fB_MAINT_PREPEND\fP Zmienna może być użyta do dodania (przed) opcji uzupełniających do wartości zwróconej przez daną \fIflagę\fP. .TP \fBDEB_BUILD_MAINT_OPTIONS\fP Zmienna może być użyta do włączenia/wyłączenia różnych flag hartujących budowania poprzez opcję \fBhardening\fP. Rozdział \fBHARDENING\fP zawiera więcej szczegółów. . .SH "HARTOWANIE (HARDENING)" Istnieją opcje kompilacyjne (patrz niżej), które mogą zostać użyte do zabezpieczenia wynikowego pliku binarnego przed atakami błędu pamięci lub do zapewnienia dodatkowych ostrzeżeń podczas kompilacji. Z wyjątkiem odnotowanym niżej, są one włączone domyślnie dla architektur, które je obsługują. .P Każda funkcja hartowania może zostać włączona lub wyłączona za pomocą wartości \fBhardening\fP zmiennej środowiskowej \fBDEB_BUILD_MAINT_OPTIONS\fP, za pomocą modyfikatora "+" lub "\-". Na przykład, aby włączyć funkcję "pie" i wyłączyć "fortify" można umieścić następujący wpis w \fBdebian/rules\fP: .P export DEB_BUILD_MAINT_OPTIONS=hardening=+pie,\-fortify .P Specjalna funkcja \fBall\fP może posłużyć do włączenia lub wyłączenia wszystkich opcji hartowania na raz. Dlatego wyłączenie wszystkiego z wyjątkiem opcji "format" i "fortify" można osiągnąć tak: .P export DEB_BUILD_MAINT_OPTIONS=hardening=\-all,+format,+fortify . .TP \fBformat\fP To ustawienie (domyślnie włączone) dodaje \fB\-Wformat \-Werror=format\-security\fP do \fBCFLAGS\fP i \fBCXXFLAGS\fP. Wypisywane będą ostrzeżenia o niepoprawnie użytych łańcuchach formatu, a jeżeli funkcja formatu zostanie użyta w sposób, który może sprawiać problemy bezpieczeństwa, to zakończy się niepowodzeniem. Obecnie ostrzeżenia obejmują wywołania do funkcji \fBprintf\fP i \fBscanf\fP, gdy łańcuch formatu nie jest dosłownym łańcuchem oraz nie ma argumentów formatu, jak w \fBprintf(foo);\fP zamiast \fBprintf("%s", foo);\fP. Może stanowić to dziurę bezpieczeństwa, gdy łańcuch formatu pochodzi z niezaufanego źródła i zawiera "%n". . .TP \fBfortify\fP To ustawienie (domyślnie włączone) dodaje \fB\-D_FORTIFY_SOURCE=2\fP do \fBCPPFLAGS\fP. Podczas tworzenia kodu kompilator zna wiele informacji o rozmiarach bufora (tam gdzie to możliwe) i stara się zastąpić wywołania funkcji o nieograniczonych wielkościach bufora tymi o długości ograniczonej. Jest to użyteczne szczególnie przy starym, niechlujnym kodzie. Dodatkowo, łańcuch formatu w pamięci zapisywalnej zawierający "%n" jest blokowany. Jeśli jakaś aplikacja zależy na takim łańcuchu formatu musi zostać to przeorganizowane. Proszę zauważyć, że aby opcja ta odniosła skutek, źródło musi zostać skompilowane z \fB\-01\fP lub wyższym. .TP \fBstackprotector\fP To ustawienie (domyślnie włączone) dodaje \fB\-fstack\-protector \-\-param=ssp\-buffer\-size=4\fP do \fBCFLAGS\fP i \fBCXXFLAGS\fP. W ten sposób dodawane są sprawdzenia dotyczące nadpisania stosu. Dzięki temu, zapobiega się wielu potencjalnym atakom polegającym na wstrzyknięciu kodu, prowadzącym do przerwania pracy. W najlepszym razie, ataki polegające na wstrzyknięciu kodu są zmieniane na odmowę pracy (DoS) lub na brak błędu (w zależności od aplikacji). Ta funkcja wymaga linkowania wobec glibc (lub innej biblioteki dostarczającej \fB__stack_chk_fail\fP), więc musi być wyłączona podczas budowania \fB\-nostdlib\fP lub \fB\-ffreestanding\fP lub podobnych. . .TP \fBrelro\fP To ustawienie (domyślnie włączone) dodaje \fB\-Wl,\-z,relro\fP do \fBLDFLAGS\fP. Podczas ładowania programu, konieczne jest zapisanie wielu sekcji pamięci ELF przez linkera. Dzięki temu ustawieniu, program ładujący jest oznaczany, aby zmienił te sekcje na tylko do odczytu przed przejęciem kontroli przez program. Zapobiega to głównie atakom nadpisania GOT. Jeśli ta opcja zostanie wyłączona, wyłączane jest również \fBbindnow\fP. . .TP \fBbindnow\fP To ustawienie (domyślnie wyłączone) dodaje \fB\-Wl,\-z,now\fP do \fBLDFLAGS\fP. Podczas ładowania programu, wszystkie symbole dynamiczne są rozwiązywane, pozwalając całemu PLT na bycie oznaczonym jako tylko do odczytu (z powodu powyższego \fBrelro\fP). Ta opcja nie może zostać włączona, jeśli \fBrelro\fP nie jest włączone. . .TP \fBpie\fP To ustawienie (domyślnie wyłączone) dodaje \fB\-fPIE\fP do \fBCFLAGS\fP i \fBCXXFLAGS\fP oraz \fB\-fPIE \-pie\fP do \fBLDFLAGS\fP. Position Independent Executable (PIE) jest potrzebne, aby odnieść korzyści z Address Space Layout Randomization, które jest obsługiwane przez niektóre wersja jądra. Ponieważ ASLR może być już wymuszone w przypadku obszarów danych w stosie (stack i heap \- brk i mmap), obszary kodu muszą zostać skompilowane jako niezależne od pozycji. Biblioteki współdzielone już to czynią (\-fPIC), więc otrzymują ASLR automatycznie, ale binarne regiony .text muszą zostać zbudować PIE aby otrzymać ASLR. Gdy się to stanie, ataki ROP (Return Oriented Programming) są o wiele trudniejsze, ponieważ nie istnieją statyczne lokalizacje do przekroczenia podczas ataków uszkodzenia pamięci. Nie jest to kompatybilne z \fB\-fPIC\fP, więc należy uważać przy budowaniu obiektów dzielonych. Dodatkowo, ponieważ PIE jest zaimplementowane poprzez ogólny rejestr, niektóre architektury (głównie i386) mogą mieć wydajność zmniejszoną aż do 15% przy bardzo intensywnych obciążeniach text\-segment, jednak w większości przypadków nie jest to więcej niż 1%. Architektury z ogólniejszymi rejestrami (np. amd64) nie mają aż tak wysokich strat w najgorszym przypadku. .SH "TŁUMACZE" Piotr Roszatycki , 1999 .br Bartosz Feński , 2004-2005 .br Robert Luberda , 2006-2008 .br Wiktor Wandachowicz , 2008 .br Michał Kułach , 2012