:::: МЕНЮ ::::

Доступ к приватным атрибутам класса

В языке ABAP есть реализация паттерна «снимок» (Memento), цель которого сохранять и восстанавливать состояния объектов. Под состоянием понимается значения всех его атрибутов. Используя данный паттерн можно считать PROTECTED и PRIVATE атрибуты и изменять из значения в произвольном объекте.

Паттерн «Снимок»

Для сохранения состояния объекта используется системный вызов SYSTEM-CALL OBJMGR GET STATE, который записывает атрибуты класса в специальную сгенерированную структуру. Для восстановления объекта из структуры используется SYSTEM-CALL OBJMGR SET STATE.

Использование системных вызовов из клиентского кода настоятельно не рекомендуется, поэтому SAP предоставил специальный класс CL_OS_STATE. Ниже пример его использования.

При создании снимка, данные сохраняются в специальную сгенерированную структуру.

Зная внутренности структуры данных и имея доступ к ней, можно получить копию атрибутов произвольного объекта. Изменив структуру и восстановив снимок в объект, мы изменим атрибуты объекта.

Иными словами, получив доступ к структуре снимка мы получим доступ на чтение и на запись к атрибутам класса.

Структура данных «Снимка»

Структура данных снимка находится в атрибуте CL_OS_STATE->STATE. Данный атрибут имеет публичную зону видимости, т.е. доступ к нему открыт вне класса.

Ссылка на STATE имеет 2 вложенные структуры: в первой перечислены PROTECTED и PRIVATE поля, во второй PUBLIC поля. Порядок полей соответствует порядку определения их в классе. Если класс наследуется от другого класса, то сначала перечисляются атрибуты родительских классов, затем дочерних.

Теперь, зная структуру STATE, можно сделать пример, демонстрирующий чтение и запись PRIVATE атрибутов

Содержимое структуры STATE

Результат замены состояния

Используя RTTS, можно определять структуру произвольного объекта в Runtime и манипулировать с атрибутами в объектах без каких-либо ограничений.

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

P.S: Данная возможность не является багом или уязвимостью. Ниже официальный ответ от SAP.

Since this is only exploitable with authorization S_DELEVOP, which enables you to do almost anything anyway, there is no protection for this kind of «inside» attack or put differently. There is no protection from developers.


Присоединиться к обсуждению...