[PATCH setup] Add new option --chown-admin
Christian Franke
Christian.Franke@t-online.de
Thu Jul 7 14:45:02 GMT 2022
Jon Turney wrote:
> On 06/07/2022 17:34, Christian Franke wrote:
>> Jon Turney wrote:
>>> On 06/07/2022 08:14, Christian Franke wrote:
>>>> If an installer is run elevated, the installed files will be
>>>> typically owned by the local administrator (or in some cases SYSTEM
>>>> or TrustedInstaller) instead of the current user. This is not the
>>>> case for a Cygwin "All Users" installation. The files are then not
>>>> protected from
>>>
>>> ... instead the files are owned by the user running setup?
>>
>> Yes, because the TokenUser is unconditionally copied to TokenOwner.
>> Some research with 'git blame' shows that many parts of the related
>> code are from the early days of UAC and elevated processes (Vista
>> 2006, Win7 2009). Things may have changed since then, I don't know
>> (or remember).
>>
>> If a process is run elevated, Windows keeps TokenUser unchanged but
>> sets the TokenOwner to local administrator. The --chown-admin option
>> simply keeps this as is, so no actual chown() is needed later. The
>> TokenPrimaryGroup is not changed by Windows, therefore --chown-admin
>> calls setAdminGroup() to mimic the usual "root root" ownership.
>>
>> Typical simple installers leave everything as is, so the installed
>> files are owned by local adminstrator and group "None"
>> (S-1-5-21-*-513), see 'ls -l "$PROGRAMFILES"'.
>>
>>
>>>> accidental changes by this user.
>>>>
>>>> The attached patch adds an experimental --chown-admin option which
>>>> allows (new) installations owned by local administrator user and
>>>> group.
>>>
>>> Thanks for the patch, but...
>>>
>>>> A drawback is that files generated by postinstall scripts are still
>>>> owned by current user + "None" group. It should be possible to fix
>>>> this with some perpetual preremove+postinstall scripts.
>>>>
>>>> I also don't know whether this may break some postinstall scripts.
>>>>
>>>> BTW: 'nt_sec.setDefaultSecurity (isAdmin)' is never called with
>>>> 'isAdmin==true' as 'root_scope' is always 0.
>>>
>>> root_scope is set later, by the "Install For" option on the "Select
>>> Root Install Directory" page.
>>>
>>> To me, this looks like a (very long standing) bug that we shouldn't
>>> be calling setAdminGroup() here, but after root_scope has been set.
>>
>> If this bug is very old, I'm not sure whether this should be fixed.
>> Setting admin group to files which are owned "only" by current user
>> is possibly not very effective.
>
> It's true that some people might be relying on that buggy behaviour.
I have one very old Cygwin installation from Win7 times. Very old
installed files still have group="Administrator", newer files have
group="None". The timestamps suggest that the regression was introduced
early in 2012. The first file with group="None" is from March 2 2012.
> But, please help me understand how your patch differs from adding an
> option which fixes that misbehaviour when supplied?
It does fix the regression, it adds a new installation flavor which
fixes it as a side effect.
Possible owner:group assignments of newly installed dirs/files:
"All Users":
adm:adm -- With this patch and --chown-admin set
usr:def -- Current behavior, regardless of this patch
usr:adm -- Before 'isAdmin always false' regression was introduced
"Just Me":
adm:adm -- With this patch, --chown-admin set and setup has admin rights
usr:def -- Otherwise
(usr = user running setup, adm = S-1-5-32-544, def = S-1-5-21-*-513)
>
> (As an aside, looking at how setAdminGroup()/resetPrimaryGroup() are
> used, changing the token for the postinstall scripts seems unnecessary
> now, since we don't run mkpasswd there any more...)
Agree.
More information about the Cygwin-apps
mailing list