6 Commits

Author SHA1 Message Date
Hideki Saito
e98d9a0756 Release 2.2.2 commit (#771)
Signed-off-by: Hideki Saito <saito@fgrep.org>
2026-07-13 10:14:46 +09:00
Hideki Saito
73939ba8ff Update README Support section to reference Red Hat Automation Hub (#768) (#770)
Signed-off-by: Hideki Saito <saito@fgrep.org>
2026-07-08 15:11:56 +09:00
Hideki Saito
2504f532b8 Remove meta-runtime[unsupported-version] line from the skip_list (#767) (#769)
Signed-off-by: Hideki Saito <saito@fgrep.org>
2026-07-08 11:43:37 +09:00
Hideki Saito
4ac4603af5 Release 2.2.1 commit (#765)
2.2.1 release

Signed-off-by: Hideki Saito <saito@fgrep.org>
2026-07-02 10:43:07 +09:00
Hideki Saito
a4805b92b7 Fixes the symlink handling issue in the authorized_key module (#760) (#762)
- Addresses CVE-2026-11837
- Fixes #759

Signed-off-by: Hideki Saito <saito@fgrep.org>
2026-07-01 12:30:27 +09:00
Hideki Saito
ee1461f46c Replace remote test env RHEL9.7 and 10.1 with 9.8 and 10.2 (#764)
- Replace 9.7 with 9.8
- Replace 10.1 with 10.2
- Addresses https://github.com/ansible/ansible/pull/87120

Signed-off-by: Hideki Saito <saito@fgrep.org>
2026-07-01 11:56:25 +09:00
15 changed files with 188 additions and 28 deletions

View File

@@ -4,7 +4,6 @@
# SPDX-FileCopyrightText: 2024, Ansible Project
skip_list:
- meta-runtime[unsupported-version] # This rule doesn't make any sense
- fqcn[deep] # This rule produces false positives for files in tests/unit/plugins/action/fixtures/
- sanity[cannot-ignore] # This rule is skipped to keep backward compatibility with Python 2

View File

@@ -271,10 +271,10 @@ stages:
parameters:
testFormat: devel/{0}/1
targets:
- name: RHEL 10.1
test: rhel/10.1
- name: RHEL 9.7
test: rhel/9.7
- name: RHEL 10.2
test: rhel/10.2
- name: RHEL 9.8
test: rhel/9.8
- name: FreeBSD 14.4
test: freebsd/14.4
- name: FreeBSD 15.0

View File

@@ -4,6 +4,43 @@ ansible.posix Release Notes
.. contents:: Topics
v2.2.2
======
Release Summary
---------------
This is the minor release of the ``ansible.posix`` collection.
This changelog contains all changes to the modules and plugins
in the stable-2 branch that have been added after the release of
``ansible.posix`` 2.2.1
Bugfixes
--------
- README - Added ``Red Hat Automation Hub`` as correct contact information for Red Hat Ansible Automation Platform subscribers.
v2.2.1
======
Release Summary
---------------
This is the minor release of the ``ansible.posix`` collection.
This changelog contains all changes to the modules and plugins
in the stable-2 branch that have been added after the release of
``ansible.posix`` 2.2.0
Security Fixes
--------------
- authorized_key - fix local privilege escalation via symlink-following when running as root (https://github.com/ansible-collections/ansible.posix/issues/759).
Bugfixes
--------
- sysctl - reload sysctl only if the sysctl file is ``/etc/sysctl.conf`` or ``/etc/sysctl.conf.local`` (https://github.com/ansible-collections/ansible.posix/issues/663).
v2.2.0
======

View File

@@ -99,7 +99,8 @@ We welcome community contributions to this collection. For more details, see [Co
## Support
See [Communication](#Communication) section.
* Community users can find help through the [Communication](#Communication) section.
* Red Hat Ansible Automation Platform subscribers can request support through [Automation Hub](https://console.redhat.com/ansible/automation-hub/collections/published/ansible/posix/) by using the "Create issue" button on the collection page.
## Release Notes and Roadmap

View File

@@ -578,3 +578,44 @@ releases:
- firewalld_info_warnings.yml
- patch_removed.yml
release_date: '2026-05-18'
2.2.1:
changes:
bugfixes:
- sysctl - reload sysctl only if the sysctl file is ``/etc/sysctl.conf`` or
``/etc/sysctl.conf.local`` (https://github.com/ansible-collections/ansible.posix/issues/663).
release_summary: 'This is the minor release of the ``ansible.posix`` collection.
This changelog contains all changes to the modules and plugins
in the stable-2 branch that have been added after the release of
``ansible.posix`` 2.2.0'
security_fixes:
- authorized_key - fix local privilege escalation via symlink-following when
running as root (https://github.com/ansible-collections/ansible.posix/issues/759).
fragments:
- 2.2.1.yml
- 643-sysctl-docs.yml
- 751_ci_test_container_update.yml
- 755_ci_test_container_update.yml
- 759_cve_2026_11837.yml
- 763_ci_azp_update_devel.yml
- freebsd_sysctl.yml
release_date: '2026-07-01'
2.2.2:
changes:
bugfixes:
- README - Added ``Red Hat Automation Hub`` as correct contact information for
Red Hat Ansible Automation Platform subscribers.
release_summary: 'This is the minor release of the ``ansible.posix`` collection.
This changelog contains all changes to the modules and plugins
in the stable-2 branch that have been added after the release of
``ansible.posix`` 2.2.1'
fragments:
- 2.2.2.yml
- 767_remove_unsupported_version_skip.yml
- 768_update_support_section.yml
release_date: '2026-07-08'

View File

@@ -1,3 +0,0 @@
---
trivial:
- sysctl - added the attributes section to the module documentation to reflect check_mode support (https://github.com/ansible-collections/ansible.posix/issues/643).

View File

@@ -1,3 +0,0 @@
---
trivial:
- Update Azure Pipelines test container to 8.0.0 and use legacy container for ansible-core 2.16/2.17.

View File

@@ -1,3 +0,0 @@
---
trivial:
- Replace AZP remote test FreeBSD-14.2 with 14.3 for Ansible Core 2.19.

View File

@@ -1,3 +0,0 @@
---
bugfixes:
- sysctl - reload sysctl only if the sysctl file is ``/etc/sysctl.conf`` or ``/etc/sysctl.conf.local`` (https://github.com/ansible-collections/ansible.posix/issues/663).

View File

@@ -1,7 +1,7 @@
---
namespace: ansible
name: posix
version: 2.2.0
version: 2.2.2
readme: README.md
authors:
- Ansible (github.com/ansible)

View File

@@ -307,6 +307,17 @@ class keydict(dict):
return [item[1] for item in self.items()]
def _safe_open_write(module, path, follow):
flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
if not follow and hasattr(os, 'O_NOFOLLOW'):
flags |= os.O_NOFOLLOW
try:
fd = os.open(path, flags, int('0600', 8))
except OSError as e:
module.fail_json(msg="File open failed %s : %s" % (path, to_native(e)))
return fd
def keyfile(module, user, write=False, path=None, manage_dir=True, follow=False):
"""
Calculate name of authorized keys file, optionally creating the
@@ -359,7 +370,7 @@ def keyfile(module, user, write=False, path=None, manage_dir=True, follow=False)
module.fail_json(msg="Failed to create directory %s : %s" % (sshdir, to_native(e)))
if module.selinux_enabled():
module.set_default_selinux_context(sshdir, False)
os.chown(sshdir, uid, gid)
os.chown(sshdir, uid, gid, follow_symlinks=follow)
os.chmod(sshdir, int('0700', 8))
if not os.path.exists(keysfile):
@@ -367,16 +378,13 @@ def keyfile(module, user, write=False, path=None, manage_dir=True, follow=False)
if not os.path.exists(basedir):
os.makedirs(basedir)
f = None
try:
f = open(keysfile, "w") # touches file so we can set ownership and perms
finally:
f.close()
fd = _safe_open_write(module, keysfile, follow)
os.close(fd)
if module.selinux_enabled():
module.set_default_selinux_context(keysfile, False)
try:
os.chown(keysfile, uid, gid)
os.chown(keysfile, uid, gid, follow_symlinks=follow)
os.chmod(keysfile, int('0600', 8))
except OSError:
pass
@@ -607,7 +615,7 @@ def enforce_state(module, params):
# check current state -- just get the filename, don't create file
do_write = False
params["keyfile"] = keyfile(module, user, do_write, path, manage_dir)
params["keyfile"] = keyfile(module, user, do_write, path, manage_dir, follow)
existing_content = readfile(module, params["keyfile"])
existing_keys = parsekeys(module, existing_content)
@@ -696,6 +704,11 @@ def enforce_state(module, params):
if not module.check_mode:
writefile(module, filename, new_content)
user_entry = pwd.getpwnam(user)
uid = user_entry.pw_uid
gid = user_entry.pw_gid
os.chown(filename, uid, gid, follow_symlinks=follow)
os.chmod(filename, int('0600', 8))
params['changed'] = True
return params

View File

@@ -0,0 +1,22 @@
---
#
# Check: keysfile is symlink and follow=false
#
- name: Try to add key with keysfile as symlink
ansible.posix.authorized_key:
user: testuser
key: "{{ rsa_key_basic }}"
state: present
manage_dir: false
follow: false
- name: Assert target file ownership unchanged
ansible.builtin.stat:
path: /tmp/symlink_test_target/target_file
register: target_file_stat
- name: Verify target file is still owned by root
ansible.builtin.assert:
that:
- target_file_stat.stat.uid == 0
...

View File

@@ -0,0 +1,12 @@
---
- name: Remove testuser
ansible.builtin.user:
name: testuser
state: absent
remove: true
- name: Remove symlink target directory
ansible.builtin.file:
path: /tmp/symlink_test_target
state: absent
...

View File

@@ -0,0 +1,38 @@
---
- name: Create testuser for symlink tests
ansible.builtin.user:
name: testuser
create_home: true
register: testuser_result
- name: Create symlink target directory
ansible.builtin.file:
path: /tmp/symlink_test_target
state: directory
owner: root
mode: '0700'
- name: Create a target file owned by root
ansible.builtin.copy:
dest: /tmp/symlink_test_target/target_file
content: "sensitive data"
owner: root
mode: '0600'
- name: Remove .ssh directory if exists
ansible.builtin.file:
path: "{{ testuser_result.home }}/.ssh"
state: absent
- name: Create .ssh directory
ansible.builtin.file:
path: "{{ testuser_result.home }}/.ssh"
state: directory
mode: '0700'
- name: Create symlink from authorized_keys to target file
ansible.builtin.file:
src: /tmp/symlink_test_target/target_file
dest: "{{ testuser_result.home }}/.ssh/authorized_keys"
state: link
...

View File

@@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
- name: Setup testing environment
- name: Setup for testing environment
ansible.builtin.import_tasks: setup_steps.yml
- name: Test for multiple keys handling
@@ -37,3 +37,12 @@
- name: Test for permission denied files
ansible.builtin.import_tasks: check_permissions.yml
- name: CVE-2026-11837 Setup for symlink tests
ansible.builtin.import_tasks: check_symlink_setup.yml
- name: CVE-2026-11837 Test for symlink tests
ansible.builtin.import_tasks: check_symlink.yml
- name: CVE-2026-11837 Cleanup symlink test
ansible.builtin.import_tasks: check_symlink_cleanup.yml