Re: [ros-dev] [ros-diffs] [pschweitzer] 69221: [MOUNTMGR] Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: - Implement WriteRemoteDatabaseEntry() - Implement MountMgrVolumeMountPointCrea
yes Best regards, Alex Ionescu On Mon, Sep 14, 2015 at 3:16 AM, Pierre Schweitzerwrote: > Refering to CVE-2015-1769/MS15-085? > > On 14/09/2015 05:24, Alex Ionescu wrote: > > Lol, make sure not to implement the huge vulnerability Microsoft patched > > two months ago (win2k->xp-style database migration). > > > > Best regards, > > Alex Ionescu > > > > On Sun, Sep 13, 2015 at 6:52 PM, wrote: > > > >> Author: pschweitzer > >> Date: Sun Sep 13 22:52:07 2015 > >> New Revision: 69221 > >> > >> URL: http://svn.reactos.org/svn/reactos?rev=69221=rev > >> Log: > >> [MOUNTMGR] > >> Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: > >> - Implement WriteRemoteDatabaseEntry() > >> - Implement MountMgrVolumeMountPointCreated() > >> > >> Modified: > >> trunk/reactos/drivers/filters/mountmgr/database.c > >> trunk/reactos/drivers/filters/mountmgr/device.c > >> trunk/reactos/drivers/filters/mountmgr/mntmgr.h > >> trunk/reactos/drivers/filters/mountmgr/mountmgr.c > >> > >> Modified: trunk/reactos/drivers/filters/mountmgr/database.c > >> URL: > >> > http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/database.c?rev=69221=69220=69221=diff > >> > >> > == > >> --- trunk/reactos/drivers/filters/mountmgr/database.c [iso-8859-1] > >> (original) > >> +++ trunk/reactos/drivers/filters/mountmgr/database.c [iso-8859-1] Sun > >> Sep 13 22:52:07 2015 > >> @@ -192,6 +192,39 @@ > >> } > >> > >> return Entry; > >> +} > >> + > >> +/* > >> + * @implemented > >> + */ > >> +NTSTATUS > >> +WriteRemoteDatabaseEntry(IN HANDLE Database, > >> + IN LONG Offset, > >> + IN PDATABASE_ENTRY Entry) > >> +{ > >> +NTSTATUS Status; > >> +LARGE_INTEGER ByteOffset; > >> +IO_STATUS_BLOCK IoStatusBlock; > >> + > >> +ByteOffset.QuadPart = Offset; > >> +Status = ZwWriteFile(Database, > >> + NULL, > >> + NULL, > >> + NULL, > >> + , > >> + Entry, > >> + Entry->EntrySize, > >> + , > >> + NULL); > >> +if (NT_SUCCESS(Status)) > >> +{ > >> +if (IoStatusBlock.Information < Entry->EntrySize) > >> +{ > >> +Status = STATUS_INSUFFICIENT_RESOURCES; > >> +} > >> +} > >> + > >> +return Status; > >> } > >> > >> /* > >> > >> Modified: trunk/reactos/drivers/filters/mountmgr/device.c > >> URL: > >> > http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/device.c?rev=69221=69220=69221=diff > >> > >> > == > >> --- trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] > >> (original) > >> +++ trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] Sun > >> Sep 13 22:52:07 2015 > >> @@ -1688,15 +1688,242 @@ > >> return Status; > >> } > >> > >> +/* > >> + * @implemented > >> + */ > >> NTSTATUS > >> MountMgrVolumeMountPointCreated(IN PDEVICE_EXTENSION DeviceExtension, > >> IN PIRP Irp, > >> IN NTSTATUS LockStatus) > >> { > >> -UNREFERENCED_PARAMETER(DeviceExtension); > >> -UNREFERENCED_PARAMETER(Irp); > >> -UNREFERENCED_PARAMETER(LockStatus); > >> -return STATUS_NOT_IMPLEMENTED; > >> +LONG Offset; > >> +BOOLEAN Found; > >> +NTSTATUS Status; > >> +HANDLE RemoteDatabase; > >> +PMOUNTDEV_UNIQUE_ID UniqueId; > >> +PDATABASE_ENTRY DatabaseEntry; > >> +PASSOCIATED_DEVICE_ENTRY AssociatedEntry; > >> +PDEVICE_INFORMATION DeviceInformation, TargetDeviceInformation; > >> +UNICODE_STRING LinkTarget, SourceDeviceName, SourceSymbolicName, > >> TargetVolumeName, VolumeName, DbName; > >> + > >> +/* Initialize string */ > >> +LinkTarget.Length = 0; > >> +LinkTarget.MaximumLength = 0xC8; > >> +LinkTarget.Buffer = AllocatePool(LinkTarget.MaximumLength); > >> +if (LinkTarget.Buffer == NULL) > >> +{ > >> +return STATUS_INSUFFICIENT_RESOURCES; > >> +} > >> + > >> +/* If the mount point was created, then, it changed! > >> + * Also use it to query some information > >> + */ > >> +Status = MountMgrVolumeMountPointChanged(DeviceExtension, Irp, > >> LockStatus, , , ); > >> +/* Pending means DB are under synchronization, bail out */ > >> +if (Status == STATUS_PENDING) > >> +{ > >> +FreePool(LinkTarget.Buffer); > >> +FreePool(SourceDeviceName.Buffer); > >> +FreePool(SourceSymbolicName.Buffer); > >> +return STATUS_PENDING; > >> +} > >> +else if (!NT_SUCCESS(Status)) > >> +{ > >> +FreePool(LinkTarget.Buffer); > >> +return Status; > >> +} > >> + > >> +
Re: [ros-dev] [ros-diffs] [pschweitzer] 69221: [MOUNTMGR] Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: - Implement WriteRemoteDatabaseEntry() - Implement MountMgrVolumeMountPointCrea
Refering to CVE-2015-1769/MS15-085? On 14/09/2015 05:24, Alex Ionescu wrote: > Lol, make sure not to implement the huge vulnerability Microsoft patched > two months ago (win2k->xp-style database migration). > > Best regards, > Alex Ionescu > > On Sun, Sep 13, 2015 at 6:52 PM,wrote: > >> Author: pschweitzer >> Date: Sun Sep 13 22:52:07 2015 >> New Revision: 69221 >> >> URL: http://svn.reactos.org/svn/reactos?rev=69221=rev >> Log: >> [MOUNTMGR] >> Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: >> - Implement WriteRemoteDatabaseEntry() >> - Implement MountMgrVolumeMountPointCreated() >> >> Modified: >> trunk/reactos/drivers/filters/mountmgr/database.c >> trunk/reactos/drivers/filters/mountmgr/device.c >> trunk/reactos/drivers/filters/mountmgr/mntmgr.h >> trunk/reactos/drivers/filters/mountmgr/mountmgr.c >> >> Modified: trunk/reactos/drivers/filters/mountmgr/database.c >> URL: >> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/database.c?rev=69221=69220=69221=diff >> >> == >> --- trunk/reactos/drivers/filters/mountmgr/database.c [iso-8859-1] >> (original) >> +++ trunk/reactos/drivers/filters/mountmgr/database.c [iso-8859-1] Sun >> Sep 13 22:52:07 2015 >> @@ -192,6 +192,39 @@ >> } >> >> return Entry; >> +} >> + >> +/* >> + * @implemented >> + */ >> +NTSTATUS >> +WriteRemoteDatabaseEntry(IN HANDLE Database, >> + IN LONG Offset, >> + IN PDATABASE_ENTRY Entry) >> +{ >> +NTSTATUS Status; >> +LARGE_INTEGER ByteOffset; >> +IO_STATUS_BLOCK IoStatusBlock; >> + >> +ByteOffset.QuadPart = Offset; >> +Status = ZwWriteFile(Database, >> + NULL, >> + NULL, >> + NULL, >> + , >> + Entry, >> + Entry->EntrySize, >> + , >> + NULL); >> +if (NT_SUCCESS(Status)) >> +{ >> +if (IoStatusBlock.Information < Entry->EntrySize) >> +{ >> +Status = STATUS_INSUFFICIENT_RESOURCES; >> +} >> +} >> + >> +return Status; >> } >> >> /* >> >> Modified: trunk/reactos/drivers/filters/mountmgr/device.c >> URL: >> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/device.c?rev=69221=69220=69221=diff >> >> == >> --- trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] >> (original) >> +++ trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] Sun >> Sep 13 22:52:07 2015 >> @@ -1688,15 +1688,242 @@ >> return Status; >> } >> >> +/* >> + * @implemented >> + */ >> NTSTATUS >> MountMgrVolumeMountPointCreated(IN PDEVICE_EXTENSION DeviceExtension, >> IN PIRP Irp, >> IN NTSTATUS LockStatus) >> { >> -UNREFERENCED_PARAMETER(DeviceExtension); >> -UNREFERENCED_PARAMETER(Irp); >> -UNREFERENCED_PARAMETER(LockStatus); >> -return STATUS_NOT_IMPLEMENTED; >> +LONG Offset; >> +BOOLEAN Found; >> +NTSTATUS Status; >> +HANDLE RemoteDatabase; >> +PMOUNTDEV_UNIQUE_ID UniqueId; >> +PDATABASE_ENTRY DatabaseEntry; >> +PASSOCIATED_DEVICE_ENTRY AssociatedEntry; >> +PDEVICE_INFORMATION DeviceInformation, TargetDeviceInformation; >> +UNICODE_STRING LinkTarget, SourceDeviceName, SourceSymbolicName, >> TargetVolumeName, VolumeName, DbName; >> + >> +/* Initialize string */ >> +LinkTarget.Length = 0; >> +LinkTarget.MaximumLength = 0xC8; >> +LinkTarget.Buffer = AllocatePool(LinkTarget.MaximumLength); >> +if (LinkTarget.Buffer == NULL) >> +{ >> +return STATUS_INSUFFICIENT_RESOURCES; >> +} >> + >> +/* If the mount point was created, then, it changed! >> + * Also use it to query some information >> + */ >> +Status = MountMgrVolumeMountPointChanged(DeviceExtension, Irp, >> LockStatus, , , ); >> +/* Pending means DB are under synchronization, bail out */ >> +if (Status == STATUS_PENDING) >> +{ >> +FreePool(LinkTarget.Buffer); >> +FreePool(SourceDeviceName.Buffer); >> +FreePool(SourceSymbolicName.Buffer); >> +return STATUS_PENDING; >> +} >> +else if (!NT_SUCCESS(Status)) >> +{ >> +FreePool(LinkTarget.Buffer); >> +return Status; >> +} >> + >> +/* Query the device information */ >> +Status = FindDeviceInfo(DeviceExtension, , FALSE, >> ); >> +if (!NT_SUCCESS(Status)) >> +{ >> +/* If it failed, first try to get volume name */ >> +Status = QueryVolumeName(0, NULL, , , >> ); >> +if (!NT_SUCCESS(Status)) >> +{ >> +/* Then, try to read the symlink */ >> +Status =
Re: [ros-dev] [ros-diffs] [pschweitzer] 69221: [MOUNTMGR] Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: - Implement WriteRemoteDatabaseEntry() - Implement MountMgrVolumeMountPointCrea
u can implement thisit is wonderful On Mon, Sep 14, 2015 at 8:54 AM, Alex Ionescuwrote: > Lol, make sure not to implement the huge vulnerability Microsoft patched > two months ago (win2k->xp-style database migration). > > Best regards, > Alex Ionescu > > On Sun, Sep 13, 2015 at 6:52 PM, wrote: > >> Author: pschweitzer >> Date: Sun Sep 13 22:52:07 2015 >> New Revision: 69221 >> >> URL: http://svn.reactos.org/svn/reactos?rev=69221=rev >> Log: >> [MOUNTMGR] >> Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: >> - Implement WriteRemoteDatabaseEntry() >> - Implement MountMgrVolumeMountPointCreated() >> >> Modified: >> trunk/reactos/drivers/filters/mountmgr/database.c >> trunk/reactos/drivers/filters/mountmgr/device.c >> trunk/reactos/drivers/filters/mountmgr/mntmgr.h >> trunk/reactos/drivers/filters/mountmgr/mountmgr.c >> >> Modified: trunk/reactos/drivers/filters/mountmgr/database.c >> URL: >> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/database.c?rev=69221=69220=69221=diff >> >> == >> --- trunk/reactos/drivers/filters/mountmgr/database.c [iso-8859-1] >> (original) >> +++ trunk/reactos/drivers/filters/mountmgr/database.c [iso-8859-1] Sun >> Sep 13 22:52:07 2015 >> @@ -192,6 +192,39 @@ >> } >> >> return Entry; >> +} >> + >> +/* >> + * @implemented >> + */ >> +NTSTATUS >> +WriteRemoteDatabaseEntry(IN HANDLE Database, >> + IN LONG Offset, >> + IN PDATABASE_ENTRY Entry) >> +{ >> +NTSTATUS Status; >> +LARGE_INTEGER ByteOffset; >> +IO_STATUS_BLOCK IoStatusBlock; >> + >> +ByteOffset.QuadPart = Offset; >> +Status = ZwWriteFile(Database, >> + NULL, >> + NULL, >> + NULL, >> + , >> + Entry, >> + Entry->EntrySize, >> + , >> + NULL); >> +if (NT_SUCCESS(Status)) >> +{ >> +if (IoStatusBlock.Information < Entry->EntrySize) >> +{ >> +Status = STATUS_INSUFFICIENT_RESOURCES; >> +} >> +} >> + >> +return Status; >> } >> >> /* >> >> Modified: trunk/reactos/drivers/filters/mountmgr/device.c >> URL: >> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/device.c?rev=69221=69220=69221=diff >> >> == >> --- trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] >> (original) >> +++ trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] Sun >> Sep 13 22:52:07 2015 >> @@ -1688,15 +1688,242 @@ >> return Status; >> } >> >> +/* >> + * @implemented >> + */ >> NTSTATUS >> MountMgrVolumeMountPointCreated(IN PDEVICE_EXTENSION DeviceExtension, >> IN PIRP Irp, >> IN NTSTATUS LockStatus) >> { >> -UNREFERENCED_PARAMETER(DeviceExtension); >> -UNREFERENCED_PARAMETER(Irp); >> -UNREFERENCED_PARAMETER(LockStatus); >> -return STATUS_NOT_IMPLEMENTED; >> +LONG Offset; >> +BOOLEAN Found; >> +NTSTATUS Status; >> +HANDLE RemoteDatabase; >> +PMOUNTDEV_UNIQUE_ID UniqueId; >> +PDATABASE_ENTRY DatabaseEntry; >> +PASSOCIATED_DEVICE_ENTRY AssociatedEntry; >> +PDEVICE_INFORMATION DeviceInformation, TargetDeviceInformation; >> +UNICODE_STRING LinkTarget, SourceDeviceName, SourceSymbolicName, >> TargetVolumeName, VolumeName, DbName; >> + >> +/* Initialize string */ >> +LinkTarget.Length = 0; >> +LinkTarget.MaximumLength = 0xC8; >> +LinkTarget.Buffer = AllocatePool(LinkTarget.MaximumLength); >> +if (LinkTarget.Buffer == NULL) >> +{ >> +return STATUS_INSUFFICIENT_RESOURCES; >> +} >> + >> +/* If the mount point was created, then, it changed! >> + * Also use it to query some information >> + */ >> +Status = MountMgrVolumeMountPointChanged(DeviceExtension, Irp, >> LockStatus, , , ); >> +/* Pending means DB are under synchronization, bail out */ >> +if (Status == STATUS_PENDING) >> +{ >> +FreePool(LinkTarget.Buffer); >> +FreePool(SourceDeviceName.Buffer); >> +FreePool(SourceSymbolicName.Buffer); >> +return STATUS_PENDING; >> +} >> +else if (!NT_SUCCESS(Status)) >> +{ >> +FreePool(LinkTarget.Buffer); >> +return Status; >> +} >> + >> +/* Query the device information */ >> +Status = FindDeviceInfo(DeviceExtension, , FALSE, >> ); >> +if (!NT_SUCCESS(Status)) >> +{ >> +/* If it failed, first try to get volume name */ >> +Status = QueryVolumeName(0, NULL, , >> , ); >> +if (!NT_SUCCESS(Status)) >> +{ >> +/* Then, try to read the symlink */ >>
Re: [ros-dev] [ros-diffs] [pschweitzer] 69221: [MOUNTMGR] Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: - Implement WriteRemoteDatabaseEntry() - Implement MountMgrVolumeMountPointCrea
Lol, make sure not to implement the huge vulnerability Microsoft patched two months ago (win2k->xp-style database migration). Best regards, Alex Ionescu On Sun, Sep 13, 2015 at 6:52 PM,wrote: > Author: pschweitzer > Date: Sun Sep 13 22:52:07 2015 > New Revision: 69221 > > URL: http://svn.reactos.org/svn/reactos?rev=69221=rev > Log: > [MOUNTMGR] > Implement the IOCTL IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED: > - Implement WriteRemoteDatabaseEntry() > - Implement MountMgrVolumeMountPointCreated() > > Modified: > trunk/reactos/drivers/filters/mountmgr/database.c > trunk/reactos/drivers/filters/mountmgr/device.c > trunk/reactos/drivers/filters/mountmgr/mntmgr.h > trunk/reactos/drivers/filters/mountmgr/mountmgr.c > > Modified: trunk/reactos/drivers/filters/mountmgr/database.c > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/database.c?rev=69221=69220=69221=diff > > == > --- trunk/reactos/drivers/filters/mountmgr/database.c [iso-8859-1] > (original) > +++ trunk/reactos/drivers/filters/mountmgr/database.c [iso-8859-1] Sun > Sep 13 22:52:07 2015 > @@ -192,6 +192,39 @@ > } > > return Entry; > +} > + > +/* > + * @implemented > + */ > +NTSTATUS > +WriteRemoteDatabaseEntry(IN HANDLE Database, > + IN LONG Offset, > + IN PDATABASE_ENTRY Entry) > +{ > +NTSTATUS Status; > +LARGE_INTEGER ByteOffset; > +IO_STATUS_BLOCK IoStatusBlock; > + > +ByteOffset.QuadPart = Offset; > +Status = ZwWriteFile(Database, > + NULL, > + NULL, > + NULL, > + , > + Entry, > + Entry->EntrySize, > + , > + NULL); > +if (NT_SUCCESS(Status)) > +{ > +if (IoStatusBlock.Information < Entry->EntrySize) > +{ > +Status = STATUS_INSUFFICIENT_RESOURCES; > +} > +} > + > +return Status; > } > > /* > > Modified: trunk/reactos/drivers/filters/mountmgr/device.c > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filters/mountmgr/device.c?rev=69221=69220=69221=diff > > == > --- trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] > (original) > +++ trunk/reactos/drivers/filters/mountmgr/device.c [iso-8859-1] Sun > Sep 13 22:52:07 2015 > @@ -1688,15 +1688,242 @@ > return Status; > } > > +/* > + * @implemented > + */ > NTSTATUS > MountMgrVolumeMountPointCreated(IN PDEVICE_EXTENSION DeviceExtension, > IN PIRP Irp, > IN NTSTATUS LockStatus) > { > -UNREFERENCED_PARAMETER(DeviceExtension); > -UNREFERENCED_PARAMETER(Irp); > -UNREFERENCED_PARAMETER(LockStatus); > -return STATUS_NOT_IMPLEMENTED; > +LONG Offset; > +BOOLEAN Found; > +NTSTATUS Status; > +HANDLE RemoteDatabase; > +PMOUNTDEV_UNIQUE_ID UniqueId; > +PDATABASE_ENTRY DatabaseEntry; > +PASSOCIATED_DEVICE_ENTRY AssociatedEntry; > +PDEVICE_INFORMATION DeviceInformation, TargetDeviceInformation; > +UNICODE_STRING LinkTarget, SourceDeviceName, SourceSymbolicName, > TargetVolumeName, VolumeName, DbName; > + > +/* Initialize string */ > +LinkTarget.Length = 0; > +LinkTarget.MaximumLength = 0xC8; > +LinkTarget.Buffer = AllocatePool(LinkTarget.MaximumLength); > +if (LinkTarget.Buffer == NULL) > +{ > +return STATUS_INSUFFICIENT_RESOURCES; > +} > + > +/* If the mount point was created, then, it changed! > + * Also use it to query some information > + */ > +Status = MountMgrVolumeMountPointChanged(DeviceExtension, Irp, > LockStatus, , , ); > +/* Pending means DB are under synchronization, bail out */ > +if (Status == STATUS_PENDING) > +{ > +FreePool(LinkTarget.Buffer); > +FreePool(SourceDeviceName.Buffer); > +FreePool(SourceSymbolicName.Buffer); > +return STATUS_PENDING; > +} > +else if (!NT_SUCCESS(Status)) > +{ > +FreePool(LinkTarget.Buffer); > +return Status; > +} > + > +/* Query the device information */ > +Status = FindDeviceInfo(DeviceExtension, , FALSE, > ); > +if (!NT_SUCCESS(Status)) > +{ > +/* If it failed, first try to get volume name */ > +Status = QueryVolumeName(0, NULL, , , > ); > +if (!NT_SUCCESS(Status)) > +{ > +/* Then, try to read the symlink */ > +Status = MountMgrQuerySymbolicLink(, > ); > +if (!NT_SUCCESS(Status)) > +{ > +FreePool(LinkTarget.Buffer); > +FreePool(SourceDeviceName.Buffer); > +FreePool(SourceSymbolicName.Buffer); > +