Man page - pkeys(7)
Packages contains this manual
- shm_overview(7)
- nss(5)
- proc_mtrr(5)
- intro(7)
- tcp(7)
- iso_8859-9(7)
- armscii-8(7)
- proc_kpagecount(5)
- initrd(4)
- mouse(4)
- proc_stat(5)
- x25(7)
- proc_interrupts(5)
- fifo(7)
- repertoiremap(5)
- icmp(7)
- futex(7)
- feature_test_macros(7)
- lp(4)
- bpf-helpers(7)
- epoll(7)
- proc_sys_dev(5)
- namespaces(7)
- proc_sysrq-trigger(5)
- proc_bus(5)
- cp1251(7)
- proc_pid_maps(5)
- proc_sys_vm(5)
- proc_pid_projid_map(5)
- st(4)
- proc_pid(5)
- issue(5)
- pid_namespaces(7)
- unicode(7)
- inode(7)
- hosts.equiv(5)
- iso-8859-13(7)
- proc_fb(5)
- proc_modules(5)
- proc_pid_autogroup(5)
- keyrings(7)
- sysvipc(7)
- proc_kmsg(5)
- cgroups(7)
- latin6(7)
- proc_pid_uid_map(5)
- unix(7)
- proc_pid_io(5)
- pts(4)
- packet(7)
- ld-linux.so(8)
- tzselect(8)
- iconv(1)
- proc_pid_syscall(5)
- proc_pid_net(5)
- proc_pid_pagemap(5)
- tty(4)
- proc_profile(5)
- standards(7)
- proc_pid_mounts(5)
- filesystems(5)
- iso-8859-15(7)
- locale(5)
- iso_8859_3(7)
- xattr(7)
- iso-8859-2(7)
- proc_uptime(5)
- persistent-keyring(7)
- credentials(7)
- proc_pid_timers(5)
- utmpx(5)
- vcsa(4)
- proc_pid_exe(5)
- proc_net(5)
- proc_timer_stats(5)
- ip(7)
- proc_pid_fd(5)
- ptmx(4)
- user_namespaces(7)
- resolv.conf(5)
- url(7)
- iso_8859_5(7)
- iso_8859-8(7)
- urn(7)
- process-keyring(7)
- proc_pid_auxv(5)
- proc_ksyms(5)
- proc_ide(5)
- veth(4)
- ldd(1)
- proc_swaps(5)
- landlock(7)
- proc_vmstat(5)
- system_data_types(7)
- cp1252(7)
- lirc(4)
- proc_kpageflags(5)
- random(7)
- precedence(7)
- cpuset(7)
- proc_pid_ns(5)
- acct(5)
- latin4(7)
- proc_pid_cgroup(5)
- proc_cpuinfo(5)
- iso_8859-2(7)
- proc_keys(5)
- charsets(7)
- pldd(1)
- proc_pid_stat(5)
- rtnetlink(7)
- netlink(7)
- ram(4)
- mem(4)
- iso-8859-6(7)
- proc_key-users(5)
- iso_8859_15(7)
- fanotify(7)
- proc_sys_net(5)
- sysfs(5)
- math_error(7)
- latin1(7)
- proc_pid_root(5)
- nptl(7)
- proc_cgroups(5)
- proc_iomem(5)
- proc_pid_statm(5)
- sem_overview(7)
- hier(7)
- full(4)
- proc_pid_status(5)
- proc_pid_cwd(5)
- proc_pid_cpuset(5)
- proc_scsi(5)
- uri(7)
- proc_diskstats(5)
- iso_8859_6(7)
- latin2(7)
- latin5(7)
- man-pages(7)
- ld.so(8)
- uts_namespaces(7)
- proc_pid_mountstats(5)
- intro(3)
- proc_pid_seccomp(5)
- proc_pid_wchan(5)
- attributes(7)
- symlink(7)
- mount_namespaces(7)
- charmap(5)
- tis-620(7)
- iso-8859-10(7)
- getent(1)
- proc_buddyinfo(5)
- ttytype(5)
- rtc(4)
- proc_malloc(5)
- suffixes(7)
- sln(8)
- signal(7)
- proc_sys_abi(5)
- signal-safety(7)
- time_namespaces(7)
- proc_pid_comm(5)
- raw(7)
- gai.conf(5)
- proc_crypto(5)
- locale(1)
- iso-8859-3(7)
- motd(5)
- proc_meminfo(5)
- iso-8859-8(7)
- protocols(5)
- proc_pid_map_files(5)
- pthreads(7)
- null(4)
- proc(5)
- zdump(8)
- socket(7)
- proc_sys_kernel(5)
- ddp(7)
- memusagestat(1)
- hd(4)
- iso-8859-14(7)
- shells(5)
- pipe(7)
- glob(7)
- proc_self(5)
- network_namespaces(7)
- utmp(5)
- proc_kcore(5)
- nsswitch.conf(5)
- sd(4)
- iso-8859-5(7)
- iso_8859_16(7)
- man(7)
- iso_8859-6(7)
- dir_colors(5)
- mq_overview(7)
- vsock(7)
- ascii(7)
- thread-keyring(7)
- fs(5)
- proc_pid_attr(5)
- proc_sys_debug(5)
- proc_sys(5)
- proc_pid_cmdline(5)
- pty(7)
- services(5)
- cgroup_namespaces(7)
- securetty(5)
- netdevice(7)
- iso_8859_13(7)
- host.conf(5)
- proc_pid_setgroups(5)
- proc_slabinfo(5)
- sock_diag(7)
- iso_8859-14(7)
- iso-8859-11(7)
- iso_8859_11(7)
- operator(7)
- regex(7)
- wavelan(4)
- proc_sys_fs(5)
- nologin(5)
- proc_pci(5)
- koi8-r(7)
- erofs(5)
- intro(2)
- utf8(7)
- proc_kallsyms(5)
- proc_sysvipc(5)
- queue(7)
- proc_sys_sunrpc(5)
- intro(5)
- latin8(7)
- mtrace(1)
- ipc_namespaces(7)
- dsp56k(4)
- iso_8859_4(7)
- proc_pid_smaps(5)
- proc_cmdline(5)
- rpc(5)
- proc_tty(5)
- proc_version(5)
- smartpqi(4)
- proc_pid_timerslack_ns(5)
- aio(7)
- session-keyring(7)
- resolver(5)
- slabinfo(5)
- wtmp(5)
- iso_8859_9(7)
- proc_locks(5)
- mailaddr(7)
- proc_pid_oom_score(5)
- kmem(4)
- iconvconfig(8)
- iso_8859-7(7)
- glibc(7)
- hostname(7)
- proc_thread-self(5)
- ipv6(7)
- iso_8859_7(7)
- proc_kpagecgroup(5)
- core(5)
- time(7)
- units(7)
- proc_dma(5)
- loop(4)
- address_families(7)
- zero(4)
- intro(4)
- procfs(5)
- iso_8859-4(7)
- vdso(7)
- tmpfs(5)
- iso-8859-16(7)
- iso_8859_10(7)
- user-session-keyring(7)
- libc(7)
- proc_fs(5)
- koi8-u(7)
- latin3(7)
- proc_tid_children(5)
- proc_pid_limits(5)
- proc_pid_coredump_filter(5)
- iso_8859-15(7)
- arp(7)
- urandom(4)
- iso_8859-10(7)
- hpsa(4)
- proc_pid_environ(5)
- boot(7)
- ftm(7)
- ld-linux(8)
- proc_driver(5)
- loop-control(4)
- iso_8859-16(7)
- proc_filesystems(5)
- tzfile(5)
- sprof(1)
- proc_pid_task(5)
- proc_pid_oom_score_adj(5)
- proc_mounts(5)
- iso-8859-4(7)
- iso_8859-1(7)
- utf-8(7)
- iso_8859-13(7)
- intro(6)
- proc_timer_list(5)
- rtld-audit(7)
- iso_8859-3(7)
- group(5)
- sched(7)
- proc_pid_clear_refs(5)
- hosts(5)
- iso_8859-11(7)
- numa(7)
- iso_8859_2(7)
- locale(7)
- iso-8859-1(7)
- fuse(4)
- proc_tid(5)
- proc_execdomains(5)
- proc_pid_mountinfo(5)
- intro(8)
- iso_8859_8(7)
- proc_loadavg(5)
- proc_pid_oom_adj(5)
- re_format(7)
- iso_8859_14(7)
- zic(8)
- bootparam(7)
- inotify(7)
- posixoptions(7)
- proc_partitions(5)
- iso-8859-9(7)
- proc_pid_mem(5)
- networks(5)
- proc_sys_user(5)
- udp(7)
- proc_zoneinfo(5)
- latin10(7)
- proc_pid_fdinfo(5)
- proc_pid_stack(5)
- memusage(1)
- spufs(7)
- pkeys(7)
- path_resolution(7)
- proc_ioports(5)
- intro(1)
- ldconfig(8)
- msr(4)
- svipc(7)
- port(4)
- proc_pid_personality(5)
- cciss(4)
- latin9(7)
- capabilities(7)
- localedef(1)
- vcs(4)
- iso_8859-5(7)
- elf(5)
- proc_sys_proc(5)
- console_codes(4)
- random(4)
- iso-8859-7(7)
- termcap(5)
- cpuid(4)
- environ(7)
- string_copying(7)
- proc_pid_gid_map(5)
- queue(3)
- termio(7)
- user-keyring(7)
- complex(7)
- latin7(7)
- proc_config.gz(5)
- udplite(7)
- kernel_lockdown(7)
- proc_devices(5)
- proc_apm(5)
- iso_8859_1(7)
- proc_pid_numa_maps(5)
apt-get install manpages
Available languages:
en fr ru roManual
pkeys
NOMDESCRIPTION
Comportement du gestionnaire de signal
Appels systÚme des clés de protection
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION
NOM
pkeys â Aperçu des clĂ©s de protection de la mĂ©moire
DESCRIPTION
Les clĂ©s de protection de la mĂ©moire (Memory Protection Keys â pkeys) sont une extension des permissions de la mĂ©moire basĂ©es sur les pages. Les permissions normales de page nĂ©cessitent des appels systĂšme coĂ»teux et des invalidations du TLB (Translation Lookaside Buffer) lors de modifications de permission. Les clĂ©s de protection de la mĂ©moire fournissent un mĂ©canisme pour changer les protections sans avoir besoin de modifier la table des pages lors de chaque modification de permission.
Pour utiliser pkeys , le logiciel doit dâabord « étiqueter » une page dans la table des pages avec une pkey. Une fois cette Ă©tiquette posĂ©e, une application a seulement Ă changer le contenu dâun registre pour retirer lâaccĂšs en Ă©criture ou tous les accĂšs Ă une page Ă©tiquetĂ©e.
Les clés de protection de la mémoire fonctionnent en conjonction avec les permissions PROT_READ , PROT_WRITE et PROT_EXEC existantes passées aux appels systÚme tels que mprotect (2) et mmap (2), mais agissent toujours pour restreindre encore plus ces mécanismes de permission traditionnels.
Si un processus rĂ©alise un accĂšs qui enfreint les restrictions de pkey, il reçoit un signal SIGSEGV . Consultez sigaction (2) pour des dĂ©tails sur lâinformation disponible avec ce signal.
Pour utiliser la fonctionnalitĂ© de pkeys , le processeur doit la prendre en charge et le noyau doit contenir une prise en charge pour la fonctionnalitĂ© dâun processeur donnĂ©. Au tout dĂ©but de 2016, seuls les processeurs x86 dâIntel Ă venir Ă©taient pris en charge et ceux-ci gĂ©raient 16 clĂ©s de protection de la mĂ©moire pour chaque processus. Cependant, la pkey 0 est utilisĂ©e comme clĂ© par dĂ©faut, donc un maximum de 15 sont disponibles pour une utilisation effective dâapplication. La clĂ© par dĂ©faut est affectĂ©e Ă nâimporte quelle rĂ©gion de la mĂ©moire pour laquelle une pkey nâa pas Ă©tĂ© assignĂ©e explicitement Ă lâaide de pkey_mprotect (2).
Les clĂ©s de protection ont la capacitĂ© dâajouter une couche de sĂ©curitĂ© et de fiabilitĂ© aux applications, mais elles nâont pas Ă©tĂ© conçues principalement pour une fonctionnalitĂ© de sĂ©curitĂ©. Par exemple, WRPKRU est une instruction entiĂšrement non privilĂ©giĂ©e, aussi les pkeys sont inutiles dans tous les cas oĂč un attaquant contrĂŽle le registre PKRU ou peut exĂ©cuter des instructions arbitraires.
Les applications doivent ĂȘtre trĂšs prĂ©cautionneuses pour assurer de ne pas faire « fuiter » leurs clĂ©s de protection. Par exemple, avant dâappeler pkey_free (2), lâapplication doit ĂȘtre sĂ»re quâaucune mĂ©moire a cette pkey assignĂ©e. Si lâapplication laisse la pkey libĂ©rĂ©e assignĂ©e, un prochain utilisateur de cette pkey peut par inadvertance modifier les permissions dâune structure de donnĂ©es Ă©trangĂšre, pouvant impacter la sĂ©curitĂ© ou la stabilitĂ©. Le noyau permet actuellement aux pkeys en cours dâavoir pkey_free (2) appelĂ©e sur elles, car cela pourrait avoir des implications de performance de processeur ou de mĂ©moire pour rĂ©aliser des vĂ©rifications supplĂ©mentaires nĂ©cessaires pour dĂ©sactiver cet appel. LâimplĂ©mentation des vĂ©rifications nĂ©cessaires est laissĂ©e aux applications. Celles-ci peuvent mettre en Ćuvre ces vĂ©rifications en parcourant le fichier /proc/ pid /smaps pour des rĂ©gions de la mĂ©moire ayant la pkey assignĂ©e. Plus de dĂ©tails sont fournis dans proc (5).
Toute application voulant utiliser les clĂ©s de protection doivent ĂȘtre capables de fonctionner sans elles. Elles peuvent ĂȘtre indisponibles parce que le matĂ©riel exĂ©cutant cette application ne les prennent pas en charge, le code du noyau ne fournit aucune prise en charge ou cette prise en charge a Ă©tĂ© dĂ©sactivĂ©e, ou parce que les clĂ©s ont Ă©tĂ© allouĂ©es, peut ĂȘtre par une bibliothĂšque utilisĂ©e par lâapplication. Il est recommandĂ© aux applications voulant utiliser les clĂ©s de protection de simplement appeler pkey_alloc (2) et de tester si lâappel rĂ©ussit au lieu dâessayer de dĂ©tecter une prise en charge de la fonctionnalitĂ© par tout autre moyen.
Quoique non nĂ©cessaire, la prise en charge matĂ©rielle des clĂ©s de protection peut ĂȘtre dĂ©terminĂ©e Ă lâaide de lâinstruction cpuid . La maniĂšre de rĂ©aliser cela est dĂ©crite dans le manuel pour les dĂ©veloppeurs de logiciels pour Intel. Le noyau rĂ©alise ce dĂ©nombrement et expose cette information dans le champ « flags » de /proc/cpuinfo . La chaĂźne « pku » dans ce champ indique la prise en charge matĂ©rielle des clĂ©s de protection et la chaĂźne « ospke » indique que le noyau gĂšre et active la prise en charge des clĂ©s de protection.
Les applications utilisant les threads et les clĂ©s de protection doivent ĂȘtre particuliĂšrement attentives. Les threads hĂ©ritent des droits des clĂ©s de protection de leur parent au moment de lâappel systĂšme clone (2). Les applications doivent aussi sâassurer que leurs propres permissions sont appropriĂ©es pour les threads enfant au moment de lâappel clone (2) ou de sâassurer que chaque thread enfant peut rĂ©aliser sa propre initialisation des droits de clĂ©s de protection.
Comportement du gestionnaire de signal
Chaque fois quâun gestionnaire de signal est invoquĂ© (y compris pour les signaux imbriquĂ©s), le thread obtient temporairement un nouvel ensemble par dĂ©faut de droits de clĂ©s de protection qui outrepasse les droits du contexte interrompu. Cela signifie que les applications doivent rĂ©tablir les droits dĂ©sirĂ©s des clĂ©s de protection lors de lâutilisation dâun gestionnaire de signal si ces droits diffĂ©rent de ceux par dĂ©faut. Les droits de nâimporte quel contexte sont restaurĂ©s lors du renvoi du gestionnaire de signal.
Ce comportement de signal est inhabituel et est dĂ» au fait que le registre PKRU x86 (qui stocke les droits dâaccĂšs des clĂ©s de protection) est gĂ©rĂ© avec le mĂȘme mĂ©canisme matĂ©riel (XSAVE) qui gĂšre les registres de virgule flottante. Le comportement du signal est le mĂȘme que celui des registres de virgule flottante.
Appels systÚme des clés de protection
Le noyau Linux met en Ćuvre les appels systĂšme suivants relatifs aux clĂ©s de protection : pkey_mprotect (2), pkey_alloc (2) et pkey_free (2).
Les appels systĂšme de Linux pour pkey sont disponibles uniquement si le noyau a Ă©tĂ© configurĂ© et construit avec lâoption CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS .
EXEMPLES
Le programme ci-dessous alloue une page de mĂ©moire avec les permissions en lecture et Ă©criture. Puis il Ă©crit quelques donnĂ©es dans la mĂ©moire et les relit avec succĂšs. AprĂšs cela, il essaie dâallouer une clĂ© de protection et dĂ©sactive lâaccĂšs Ă la page en utilisant lâinstruction WRPKRU. Il essaie alors dâaccĂ©der Ă la page qui est supposĂ©e provoquer un signal fatal pour lâapplication.
$
./a.out
le buffer contient : 73
sur le point de lire le buffer de nouveau...
Segmentation fault (core dumped)
Source du programme
#define
_GNU_SOURCE
#include <err.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
int
main(void)
{
int status;
int pkey;
int *buffer;
/*
* Allocation dâune page de mĂ©moire.
*/
buffer = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (buffer == MAP_FAILED)
err(EXIT_FAILURE, "mmap");
/*
* Mise de données aléatoires dans la page
(toujours OK Ă affecter).
*/
*buffer = __LINE__;
printf("le buffer contient : %d\n", *buffer);
/*
* Allocation dâune clĂ© de protection :
*/
pkey = pkey_alloc(0, 0);
if (pkey == -1)
err(EXIT_FAILURE, "pkey_alloc");
/*
* DĂ©sactivation de lâaccĂšs Ă
toute mĂ©moire avec lâensemble
* « pkey », mĂȘme si aucun droit
nâexiste Ă ce moment.
*/
status = pkey_set(pkey, PKEY_DISABLE_ACCESS);
if (status)
err(EXIT_FAILURE, "pkey_set");
/*
* Mettre la clé de protection dans « buffer
».
* Noter que câest toujours lect./Ă©crit. aussi
longtemps que mprotect()
* est concerné et que le pkey_set()
prĂ©cĂ©dent lâĂ©crase.
*/
status = pkey_mprotect(buffer, getpagesize(),
PROT_READ | PROT_WRITE, pkey);
if (status == -1)
err(EXIT_FAILURE, "pkey_mprotect");
printf("sur le point de lire le buffer de
nouveau...\n");
/*
* Cela va planter car lâaccĂšs a
été désactivé.
*/
printf("le buffer contient : %d\n", *buffer);
status = pkey_free(pkey);
if (status == -1)
err(EXIT_FAILURE, "pkey_free");
exit(EXIT_SUCCESS);
}
VOIR AUSSI
pkey_alloc (2), pkey_free (2), pkey_mprotect (2), sigaction (2)
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter Ă la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il nây a aucune RESPONSABILITĂ LĂGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .