Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
Ну иначе как от "имени системы" драйвер и не запустится. Или... 20.05.09 16:29 Число просмотров: 2478
Автор: sasha_s Статус: Незарегистрированный пользователь
|
Ну иначе как от "имени системы" драйвер и не запустится. Или я что-то путаю?
Я понимаю о чем вы хотите сказать, что мол раз драйвер запускается под SYSTEM аккаунтом, то и права он имеет соотв и все его запросы тоже, но в запросе (запрос на дисковую операцию) есть поле типа
IO_SECURITY_CONTEXT SecurityContext
так вот в нем есть токен и этот токен описывает именно того юзера который стучится к этой шаре. И этот юзер имеет нужные права.
Вот и получаем:
приходит запрос с нужными правами, в запросе подменяеться только путь и возвращается нужный код для репарза, но далее "аксес денайд". Хотя после репарза в запросе SecurityContext не отличается от изначального.
|
<operating systems>
|
filter driver, проблема с правами 20.05.09 11:19 [Den]
Автор: sasha_s Статус: Незарегистрированный пользователь
|
Есть драйвер фильтр файловых операций. Он просто перенаправляет обращения к одной шаре на другую шару с другого компа. Но... Юзер всегда отхватывает "Access denied", т.е. на прямую доступ есть, а вот при перенаправлении уже нет.
Вот код перенаправления:
PFILE_OBJECT FileObject = Data->Iopb->TargetFileObject;
// allocate memory for file name
if(FileObject->FileName.MaximumLength < Real->Length) {
PWCHAR Buffer = (PWCHAR)ExAllocatePool(NonPagedPool, Real->MaximumLength);
if(NULL == Buffer) {
ERROR(ExAllocatePool, STATUS_INSUFFICIENT_RESOURCES);
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
ExFreePool(FileObject->FileName.Buffer);
FileObject->FileName.Buffer = Buffer;
FileObject->FileName.MaximumLength = Real->MaximumLength;
}
// update name in file
FileObject->FileName.Length = Real->Length;
memCopy(FileObject->FileName.Buffer, FileObject->FileName.MaximumLength, Real->Buffer, Real->Length);
FltSetCallbackDataDirty(Data);
// reparse information
Data->IoStatus.Status = STATUS_REPARSE;
Data->IoStatus.Information = IO_REPARSE;
Real -- это путь куда идет перенаправление.
Что это за такая хитрая ишью? Есть рецепты?
|
|
Драйвер запускается от имени системы? 20.05.09 16:17
Автор: Den <Denis> Статус: The Elderman
|
|
| |
Ну иначе как от "имени системы" драйвер и не запустится. Или... 20.05.09 16:29
Автор: sasha_s Статус: Незарегистрированный пользователь
|
Ну иначе как от "имени системы" драйвер и не запустится. Или я что-то путаю?
Я понимаю о чем вы хотите сказать, что мол раз драйвер запускается под SYSTEM аккаунтом, то и права он имеет соотв и все его запросы тоже, но в запросе (запрос на дисковую операцию) есть поле типа
IO_SECURITY_CONTEXT SecurityContext
так вот в нем есть токен и этот токен описывает именно того юзера который стучится к этой шаре. И этот юзер имеет нужные права.
Вот и получаем:
приходит запрос с нужными правами, в запросе подменяеться только путь и возвращается нужный код для репарза, но далее "аксес денайд". Хотя после репарза в запросе SecurityContext не отличается от изначального.
|
| | |
Все верно 20.05.09 20:00
Автор: amirul <Serge> Статус: The Elderman
|
> Ну иначе как от "имени системы" драйвер и не запустится. > Или я что-то путаю? Ничего не путаешь. Есть вопрос: access denied случается даже если доступ к шаре (реальной) уже получен (net use \\server\share, или просто зайти туда напрямую)?
> Я понимаю о чем вы хотите сказать, что мол раз драйвер > запускается под SYSTEM аккаунтом, то и права он имеет соотв > и все его запросы тоже, но в запросе (запрос на дисковую > операцию) есть поле типа > IO_SECURITY_CONTEXT SecurityContext > так вот в нем есть токен и этот токен описывает именно того > юзера который стучится к этой шаре. И этот юзер имеет > нужные права. С редиректорами все чуть не так, насколько я помню. То есть совершенно по фигу какие права дала ЛОКАЛЬНАЯ система этому запросу, важно то, что об этом думает удаленная (собственно сервер).
> Вот и получаем: > приходит запрос с нужными правами, в запросе подменяеться > только путь и возвращается нужный код для репарза, но далее > "аксес денайд". Хотя после репарза в запросе > SecurityContext не отличается от изначального. В данном случае гораздо важнее смотреть на экстендед атрибуты (собственно SystemBuffer и Parameters.Create.EaLength), в которых передается инфа, необходимая СЕРВЕРУ для авторизации данного клиента. К сожалению с минифильтрами не работал никогда и понятия не имею как они реализуют репарс, но на уровне object manager-а open packet (с инфой об этих самых ea) @#$ится и репарснутое открытие уже происходит без них.
|
| | | |
Фуф, вот тока руки дошли проверить советы... 25.05.09 16:36
Автор: sasha_s Статус: Незарегистрированный пользователь
|
Фуф, вот тока руки дошли проверить советы...
> Есть вопрос: access denied случается > даже если доступ к шаре (реальной) уже получен (net use > \\server\share, или просто зайти туда напрямую)?
Отлуп происходит полюбому.
> С редиректорами все чуть не так, насколько я помню. То есть > совершенно по фигу какие права дала ЛОКАЛЬНАЯ система этому > запросу, важно то, что об этом думает удаленная (собственно > сервер).
Это ясно. Но после репарза что-то происходит и запросс уже совсем непонятно от чьего имени идет. Скорее всего от систем...
> В данном случае гораздо важнее смотреть на экстендед > атрибуты (собственно SystemBuffer и > Parameters.Create.EaLength), в которых передается инфа, > необходимая СЕРВЕРУ для авторизации данного клиента. К > сожалению с минифильтрами не работал никогда и понятия не > имею как они реализуют репарс, но на уровне object > manager-а open packet (с инфой об этих самых ea) @#$ится и > репарснутое открытие уже происходит без них.
Так, я немного не в теме что в этих полях храниться.
typedef union _FLT_PARAMETERS {
//
// IRP_MJ_CREATE
//
struct {
PIO_SECURITY_CONTEXT SecurityContext;
//
// The low 24 bits contains CreateOptions flag values.
// The high 8 bits contains the CreateDisposition values.
//
ULONG Options;
USHORT POINTER_ALIGNMENT FileAttributes;
USHORT ShareAccess;
ULONG POINTER_ALIGNMENT EaLength;
PVOID EaBuffer; //Not in IO_STACK_LOCATION parameters list
LARGE_INTEGER AllocationSize; //Not in IO_STACK_LOCATION parameters list
} Create;
EaBuffer, EaLength -- это они?
А что в EaBuffer лежит? Я пока рою сайт самого MS, пока ничего путного не нашел...
|
| | | | |
Вот это странно. Еще один тест: гостевая шара (пускающая без... 25.05.09 22:04
Автор: amirul <Serge> Статус: The Elderman Отредактировано 25.05.09 22:06 Количество правок: 1
|
> Фуф, вот тока руки дошли проверить советы... > > > Есть вопрос: access denied случается > > даже если доступ к шаре (реальной) уже получен (net > use > > \\server\share, или просто зайти туда напрямую)? > > Отлуп происходит полюбому. Вот это странно. Еще один тест: гостевая шара (пускающая без пароля) - пускает или нет.
> EaBuffer, EaLength -- это они? Они
> А что в EaBuffer лежит? Я пока рою сайт самого MS, пока > ничего путного не нашел... Там пары ключ (текстовый)/значение. Можно передавать файловой системе любую метаинформацию. NTFS ее сохраняет и в дальнейшем можно вычитывать. Ну а SMB использует эти атрибуты для авторизации, насколько я помню. Для твоих целей нужно просто сравнить содержимое eabuffer-а до и после репарса. Если там инфа теряется, то для авторизации на стороне сервера просто нет данных
|
| | | | | |
Может я ламер, но как сделать шару именно гостевой? 29.05.09 19:42
Автор: sasha_s Статус: Незарегистрированный пользователь
|
> > Отлуп происходит полюбому. > Вот это странно. Еще один тест: гостевая шара (пускающая > без пароля) - пускает или нет.
Может я ламер, но как сделать шару именно гостевой?
> Там пары ключ (текстовый)/значение. Можно передавать > файловой системе любую метаинформацию. NTFS ее сохраняет и > в дальнейшем можно вычитывать. Ну а SMB использует эти > атрибуты для авторизации, насколько я помню. Для твоих > целей нужно просто сравнить содержимое eabuffer-а до и > после репарса. Если там инфа теряется, то для авторизации > на стороне сервера просто нет данных
Хм...
Я в непонятках. Посмотрел до репарза: в этих полях NULL.
Data->Iopb->Parameters.Create.EaBuffer -- NULL
Data->Iopb->Parameters.Create.EaLength -- 0
где Data -- PFLT_CALLBACK_DATA Data
Я вообще правильно смотрю?
|
| | | | | | |
Я делал это давно - помню только, что через secpol.msc ->... 30.05.09 01:57
Автор: amirul <Serge> Статус: The Elderman
|
> Может я ламер, но как сделать шару именно гостевой? Я делал это давно - помню только, что через secpol.msc -> Local Policies.
> Хм... > Я в непонятках. Посмотрел до репарза: в этих полях NULL. > Data->Iopb->Parameters.Create.EaBuffer -- NULL > Data->Iopb->Parameters.Create.EaLength -- 0 > где Data -- PFLT_CALLBACK_DATA Data > Я вообще правильно смотрю? Вроде правильно. Если бы по уже установленным сессиям ходило нормально, я бы был почти уверен, что дело в этом. А так даже не знаю.
|
| | | | | |
Полагаю, что нужно получить контекст безопасности с целевой системы, на которую делается редирект. 26.05.09 01:40
Автор: Den <Denis> Статус: The Elderman
|
|
| | | | | | |
Для не-домена этого и сделать то нельзя 26.05.09 07:07
Автор: amirul <Serge> Статус: The Elderman
|
Вообще, я писал подобный редиректор, но не минифильтр, а обычный фильтр. И у меня тоже была проблема с access denied, вот только когда клиент уже установил сессию с сервером все проходило на ура.
|
|
|