Spec-Zone.ru › Perl 5.36

Opcode

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ
  • ПРИМЕЧАНИЕ
  • ПРЕДУПРЕЖДЕНИЕ
  • Имена операторов и списки операторов
  • Функции Opcode
  • Обработка наборов опкодов
  • ЗАДАЧИ (возможно)
  • Предопределенные теги Opcode
  • СМОТРИТЕ ТАКЖЕ
  • АВТОРЫ

ИМЯ

Opcode - Отключить именованные opcodes при компиляции кода Perl

СИНОПСИС

use Opcode;

ОПИСАНИЕ

Код Perl всегда компилируется во внутренний формат перед выполнением.

Вычисление кода Perl (например, через "eval" или "do 'file'") приводит к компиляции кода во внутренний формат, а затем, при отсутствии ошибок при компиляции, к выполнению. Внутренний формат основан на множестве различных opcodes.

По умолчанию никакая маска op не действует, и любой код может быть скомпилирован.

Модуль Opcode позволяет определить маску операторов, которая будет действовать при компиляции любого кода Perl. Попытка скомпилировать код, содержащий замаскированный opcode, приведет к ошибке компиляции с ошибкой. Код не будет выполнен.

ПРИМЕЧАНИЕ

Модуль Opcode обычно не используется напрямую. См. псевдоним ops и модули Safe для более типичных случаев использования.

ПРЕДУПРЕЖДЕНИЕ

Модуль Opcode не реализует эффективную зону безопасности для оценки недоверенного кода с помощью интерпретатора Perl.

Ошибки в интерпретаторе Perl, которые могут быть использованы для обхода ограничений Opcode, не рассматриваются как уязвимости. См. perlsecpolicy для получения дополнительной информации.

Авторы не гарантируют, прямо или косвенно, пригодность этого программного обеспечения для целей безопасности.

Авторы ни в коем случае не несут ответственности за особые, случайные, косвенные или иные аналогичные убытки, возникшие в результате использования данного программного обеспечения.

Результаты могут отличаться. В случае сомнений не используйте его.

Имена операторов и списки операторов

Канонический список имён операторов — содержимое массива PL_op_name, определённого и инициализированного в файле opcode.h дистрибутива исходного кода Perl (и установленного в библиотеку Perl).

Каждый оператор имеет краткое имя (его opname) и более подробное или узнаваемое описательное имя. Функция opdesc может использоваться для возвращения списка описаний для списка операторов.

Многие из перечисленных ниже функций и методов принимают список операторов в качестве параметров. Большинство списков операторов могут состоять из нескольких типов элементов. Каждый элемент может быть одним из

имя оператора (opname)

Имена операторов обычно представляют собой короткие строчные слова, такие как enterloop, leaveloop, last, next, redo и т. д. Иногда они довольно загадочные, например, gv2cv, i_ncmp и ftsvtx.

имя тега оператора (optag)

Имена тегов операторов могут использоваться для ссылки на группы (или наборы) операторов. Имена тегов всегда начинаются с двоеточия. Модуль Opcode определяет несколько optags, и пользователь может определять другие с помощью функции define_optag.

отрицаемое имя opname или optag

Имени opname или optag можно добавить префикс восклицательного знака, например, !mkdir. Отрицание opname или optag означает удаление соответствующих ops из накопленного набора ops в этот момент.

набор операторов (opset)

opset — это двоичная строка длиной примерно 44 байта, которая содержит набор одного или более операторов.

Функции opset и opset_to_ops могут использоваться для преобразования списка операторов в opset и обратно.

В любом месте, где может быть задан список операторов, можно использовать один или несколько opsets. См. также Обработку наборов опкодов ниже.

Функции Opcode

Пакет Opcode содержит функции для обработки имён операторов, тегов и наборов. Все они доступны для экспорта пакетом.

opcodes

В скалярном контексте opcodes возвращает количество opcodes в этой версии Perl (около 350 для perl-5.7.0).

В списковом контексте возвращает список всех имён операторов. (Ещё не реализовано, используйте @names = opset_to_ops(full_opset).)

opset (OP, ...)

Возвращает opset, содержащий перечисленные операторы.

opset_to_ops (OPSET)

Возвращает список имён операторов, соответствующих операторам в наборе.

opset_to_hex (OPSET)

Возвращает строковое представление opset. Может быть полезно при отладке.

full_opset

Возвращает opset, который включает все операторы.

empty_opset

Возвращает opset, не содержащий операторов.

invert_opset (OPSET)

Возвращает opset, являющийся обратным набором заданного набора.

verify_opset (OPSET, ...)

Возвращает true, если заданный opset выглядит как действительный opset (правильная длина и т. д.), в противном случае возвращает false. Если необязательный второй параметр равен true, verify_opset выведет ошибку при недействительном opset, а не вернёт false.

Большинство других функций Opcode автоматически вызывают verify_opset и выведут ошибку, если им будет передан недействительный opset.

define_optag (OPTAG, OPSET)

Определяет OPTAG как символическое имя для OPSET. Имена optag всегда начинаются с двоеточия :.

Используемое имя optag не должно быть определено уже (define_optag выведет ошибку, если оно уже определено). Имена optag являются глобальными для процесса perl, и определения optag не могут быть изменены или удалены после определения.

Настоятельно рекомендуется, чтобы приложения, использующие Opcode, использовали ведущую заглавную букву в именах своих тегов, так как строчные имена зарезервированы для использования модулем Opcode. Если вы используете Opcode в модуле, вы должны добавлять префикс имени вашего модуля к именам тегов, чтобы обеспечить уникальность и избежать конфликтов с другими модулями.

opmask_add (OPSET)

Добавляет переданный opset к текущей opmask. Обратите внимание, что в настоящее время нет механизма для отмены маскировки ops после их маскирования. Это сделано намеренно.

opmask

Возвращает opset, соответствующий текущей opmask.

opdesc (OP, ...)

Этот метод принимает список имён операторов и возвращает соответствующий список описаний операторов.

opdump (PAT)

Выводит в стандартный вывод список из двух столбцов: имён операторов и описаний операторов. Если задан необязательный шаблон, выводятся только строки, которые соответствуют шаблону (не учитывая регистр).

Он предназначен для использования в качестве удобной утилиты командной строки:

perl -MOpcode=opdump -e opdump
perl -MOpcode=opdump -e 'opdump Eval'

Обработка наборов опкодов

Наборы опкодов можно обрабатывать, используя битовые операторы Perl & (и), | (или), ^ (исключающее или) и ~ (отрицание/инверсия).

Однако вы никогда не должны полагаться на числовое положение любого opcodes в opset. Другими словами, обе стороны битового оператора должны быть опсетами, возвращаемыми функциями Opcode.

Кроме того, так как количество opcodes в вашей текущей версии Perl может не быть точным кратным восьми, в последнем байте upset могут быть неиспользуемые биты. Это не должно создавать проблем (функции Opcode игнорируют эти дополнительные биты), но это означает, что использование оператора ~ обычно не даёт такую же «физическую» строку opset, как функция invert_opset.

ЗАДАЧИ (возможно)

$bool = opset_eq($opset1, $opset2)  true if opsets are logically
                                    equivalent
$yes = opset_can($opset, @ops)      true if $opset has all @ops set

@diff = opset_diff($opset1, $opset2) => ('foo', '!bar', ...)

Предопределенные теги Opcode

:base_core
null stub scalar pushmark wantarray const defined undef

rv2sv sassign

rv2av aassign aelem aelemfast aelemfast_lex aslice kvaslice
av2arylen

rv2hv helem hslice kvhslice each values keys exists delete
aeach akeys avalues multideref argelem argdefelem argcheck

preinc i_preinc predec i_predec postinc i_postinc
postdec i_postdec int hex oct abs pow multiply i_multiply
divide i_divide modulo i_modulo add i_add subtract i_subtract

left_shift right_shift bit_and bit_xor bit_or nbit_and
nbit_xor nbit_or sbit_and sbit_xor sbit_or negate i_negate not
complement ncomplement scomplement

lt i_lt gt i_gt le i_le ge i_ge eq i_eq ne i_ne ncmp i_ncmp
slt sgt sle sge seq sne scmp
isa

substr vec stringify study pos length index rindex ord chr

ucfirst lcfirst uc lc fc quotemeta trans transr chop schop
chomp schomp

match split qr

list lslice splice push pop shift unshift reverse

cond_expr flip flop andassign orassign dorassign and or dor xor

warn die lineseq nextstate scope enter leave

rv2cv anoncode prototype coreargs avhvswitch anonconst

entersub leavesub leavesublv return method method_named
method_super method_redir method_redir_super
 -- XXX loops via recursion?

cmpchain_and cmpchain_dup

is_bool
is_weak weaken unweaken

leaveeval -- needed for Safe to operate, is safe
             without entereval
:base_mem

Эти операции, связанные с памятью, не включены в :base_core, потому что они могут легко использоваться для реализации атаки на ресурсы (например, потреблять всю доступную память).

concat multiconcat repeat join range

anonlist anonhash

Обратите внимание, что, несмотря на существование этой метки, атака на ресурс памяти всё ещё может быть возможна, используя только операции :base_core.

Отключение этих операций — очень жёсткий способ попытаться предотвратить атаку на ресурс памяти. Вероятно, в ближайшем будущем в perl будет добавлена специальная механизма ограничения памяти.

:base_loop

Эти циклические операции не включены в :base_core, потому что их можно легко использовать для реализации атаки на ресурсы (например, потреблять всё доступное время ЦП).

grepstart grepwhile
mapstart mapwhile
enteriter iter
enterloop leaveloop unstack
last next redo
goto
:base_io

Эти операции позволяют выполнять ввод и вывод данных, основанные на дескрипторе файла (а не на имени файла). Они считаются безопасными в предположении, что доступны только предварительно созданные дескрипторы файлов. Обычно для создания новых дескрипторов файлов необходимо включить другие операции, такие как open, если не учитывать магическое открытие ARGV.

readline rcatline getc read

formline enterwrite leavewrite

print say sysread syswrite send recv

eof tell seek sysseek

readdir telldir seekdir rewinddir
:base_orig

Это набор инструкций, которые ещё ожидают рассмотрения

gvsv gv gelem

padsv padav padhv padcv padany padrange introcv clonecv

once

rv2gv refgen srefgen ref refassign lvref lvrefslice lvavref
blessed refaddr reftype

bless -- could be used to change ownership of objects
         (reblessing)

 regcmaybe regcreset regcomp subst substcont

sprintf prtf -- can core dump

crypt

tie untie

dbmopen dbmclose
sselect select
pipe_op sockpair

getppid getpgrp setpgrp getpriority setpriority
localtime gmtime

entertry leavetry -- can be used to 'hide' fatal errors
entertrycatch poptry catch leavetrycatch -- similar

entergiven leavegiven
enterwhen leavewhen
break continue
smartmatch

pushdefer

custom -- where should this go

ceil floor
:base_math

Эти операции не включены в :base_core из-за риска их использования для генерации исключений с плавающей точкой (которые нужно было бы перехватывать с помощью обработчика $SIG{FPE}).

atan2 sin cos exp log sqrt

Эти операции не включены в :base_core, потому что они оказывают влияние, выходящее за рамки области.

rand srand
:base_thread

Эти операции связаны с многопоточностью.

lock
:default

Удобное имя тега для разумного набора операций по умолчанию. (Текущие разрешённые операции нестабильны во время разработки. Они будут изменяться.)

:base_core :base_mem :base_loop :base_orig :base_thread

Этот список содержал :base_io до версии Opcode 1.07.

Если для вас важна безопасность (а зачем ещё вы используете модуль Opcode?), то не следует полагаться на определение этого или любого другого тега optag!

:filesys_read
stat lstat readlink

ftatime ftblk ftchr ftctime ftdir fteexec fteowned
fteread ftewrite ftfile ftis ftlink ftmtime ftpipe
ftrexec ftrowned ftrread ftsgid ftsize ftsock ftsuid
fttty ftzero ftrwrite ftsvtx

fttext ftbinary

fileno
:sys_db
ghbyname ghbyaddr ghostent shostent ehostent      -- hosts
gnbyname gnbyaddr gnetent snetent enetent         -- networks
gpbyname gpbynumber gprotoent sprotoent eprotoent -- protocols
gsbyname gsbyport gservent sservent eservent      -- services

gpwnam gpwuid gpwent spwent epwent getlogin       -- users
ggrnam ggrgid ggrent sgrent egrent                -- groups
:browse

Удобное имя тега для разумного набора операций по умолчанию, выходящих за рамки тега :default optag. Как и :default (и, действительно, все другие optags), его текущее определение нестабильно во время разработки. Оно будет изменяться.

Тег :browse представляет собой следующий шаг после :default. Он является надмножеством операций :default и добавляет :filesys_read и :sys_db. Цель состоит в том, чтобы скрипты могли получать доступ к большей (возможно, конфиденциальной) информации о вашей системе, но не могли её изменить.

:default :filesys_read :sys_db
:filesys_open
sysopen open close
umask binmode

open_dir closedir -- other dir ops are in :base_io
:filesys_write
link unlink rename symlink truncate

mkdir rmdir

utime chmod chown

fcntl -- not strictly filesys related, but possibly as
         dangerous?
:subprocess
backtick system

fork

wait waitpid

glob -- access to Cshell via <`rm *`>
:ownprocess
exec exit kill

time tms -- could be used for timing attacks (paranoid?)
:others

Этот тег содержит группы различных специализированных инструкций, для которых не стоит определять optags.

Межпроцессное взаимодействие SystemV:

msgctl msgget msgrcv msgsnd

semctl semget semop

shmctl shmget shmread shmwrite
:load

Этот тег содержит инструкции, связанные с загрузкой модулей и получением информации о среде вызова и аргументах.

require dofile 
caller runcv
:still_to_be_decided
chdir
flock ioctl

socket getpeername ssockopt
bind connect listen accept shutdown gsockopt getsockname

sleep alarm -- changes global timer state and signal handling
sort -- assorted problems including core dumps
tied -- can be used to access object implementing a tie
pack unpack -- can be used to create/use memory pointers

hintseval -- constant op holding eval hints

entereval -- can be used to hide code from initial compile

reset

dbstate -- perl -d version of nextstate(ment) opcode
:dangerous

Этот тег просто служит контейнером для инструкций, которые вряд ли будут использоваться по имени тега, но должны быть помечены для полноты и документации.

syscall dump chroot

СМОТРИТЕ ТАКЖЕ

ops -- perl-интерфейс-pragma к модулю Opcode.

Safe -- Ограниченные области выполнения Opcode и пространства имён

АВТОРЫ

Первоначально разработан и реализован Malcolm Beattie, mbeattie@sable.ox.ac.uk в рамках Safe версии 1.

Выделен из модуля Safe версии 1, добавлены имена тегов opcodes и другие изменения, внесённые Tim Bunce.

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/Opcode

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API