VYPR
Moderate severityNVD Advisory· Published Sep 10, 2025· Updated Sep 10, 2025

CVE-2025-43784

CVE-2025-43784

Description

Improper Access Control vulnerability in Liferay Portal 7.4.0 through 7.4.3.124, and Liferay DXP 2024.Q2.0 through 2024.Q2.8, 2024.Q1.1 through 2024.Q1.12 and 7.4 GA through update 92 allows guest users to obtain object entries information via the API Builder.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
com.liferay:com.liferay.headless.builder.implMaven
< 1.0.321.0.32

Affected products

2

Patches

1
ccbae813d4a9

LPD-30579 Using the right permission checker

https://github.com/liferay/liferay-portalAlejandro TardínJul 22, 2024via ghsa
2 files changed · +41 26
  • modules/apps/headless/headless-builder/headless-builder-impl/src/main/java/com/liferay/headless/builder/internal/helper/ObjectEntryHelper.java+3 26 modified
    @@ -21,8 +21,6 @@
     import com.liferay.petra.function.transform.TransformUtil;
     import com.liferay.portal.kernel.dao.orm.QueryUtil;
     import com.liferay.portal.kernel.search.Sort;
    -import com.liferay.portal.kernel.security.permission.PermissionCheckerFactory;
    -import com.liferay.portal.kernel.security.permission.PermissionThreadLocal;
     import com.liferay.portal.kernel.service.UserLocalService;
     import com.liferay.portal.kernel.util.ListUtil;
     import com.liferay.portal.kernel.util.LocaleUtil;
    @@ -110,11 +108,6 @@ public Page<ObjectEntry> getObjectEntriesPage(
     		return _withNestedFields(
     			nestedFields,
     			() -> {
    -				PermissionThreadLocal.setPermissionChecker(
    -					_permissionCheckerFactory.create(
    -						_userLocalService.getUser(
    -							objectDefinition.getUserId())));
    -
     				DefaultObjectEntryManager defaultObjectEntryManager =
     					(DefaultObjectEntryManager)_objectEntryManager;
     
    @@ -164,11 +157,6 @@ public ObjectEntry getObjectEntry(
     		return _withNestedFields(
     			nestedFields,
     			() -> {
    -				PermissionThreadLocal.setPermissionChecker(
    -					_permissionCheckerFactory.create(
    -						_userLocalService.getUser(
    -							objectDefinition.getUserId())));
    -
     				DefaultObjectEntryManager defaultObjectEntryManager =
     					(DefaultObjectEntryManager)_objectEntryManager;
     
    @@ -195,17 +183,9 @@ public ObjectEntry getObjectEntry(
     
     		return _withNestedFields(
     			nestedFields,
    -			() -> {
    -				PermissionThreadLocal.setPermissionChecker(
    -					_permissionCheckerFactory.create(
    -						_userLocalService.getUser(
    -							objectDefinition.getUserId())));
    -
    -				return _objectEntryManager.getObjectEntry(
    -					companyId, _getDefaultDTOConverterContext(objectDefinition),
    -					objetEntryExternalReferenceCode, objectDefinition,
    -					scopeKey);
    -			});
    +			() -> _objectEntryManager.getObjectEntry(
    +				companyId, _getDefaultDTOConverterContext(objectDefinition),
    +				objetEntryExternalReferenceCode, objectDefinition, scopeKey));
     	}
     
     	public ObjectEntry getObjectEntry(
    @@ -347,9 +327,6 @@ private <T> T _withNestedFields(
     	@Reference
     	private ObjectRelationshipLocalService _objectRelationshipLocalService;
     
    -	@Reference
    -	private PermissionCheckerFactory _permissionCheckerFactory;
    -
     	@Reference
     	private UserLocalService _userLocalService;
     
    
  • modules/apps/headless/headless-builder/headless-builder-impl/src/main/java/com/liferay/headless/builder/internal/instance/lifecycle/APIApplicationPublisherPortalInstanceLifecycleListener.java+38 0 modified
    @@ -6,11 +6,19 @@
     package com.liferay.headless.builder.internal.instance.lifecycle;
     
     import com.liferay.headless.builder.application.publisher.APIApplicationPublisher;
    +import com.liferay.petra.string.StringBundler;
     import com.liferay.portal.instance.lifecycle.BasePortalInstanceLifecycleListener;
     import com.liferay.portal.instance.lifecycle.EveryNodeEveryStartup;
     import com.liferay.portal.instance.lifecycle.PortalInstanceLifecycleListener;
    +import com.liferay.portal.kernel.exception.NoSuchUserException;
     import com.liferay.portal.kernel.feature.flag.FeatureFlagManagerUtil;
     import com.liferay.portal.kernel.model.Company;
    +import com.liferay.portal.kernel.model.Role;
    +import com.liferay.portal.kernel.model.role.RoleConstants;
    +import com.liferay.portal.kernel.security.permission.PermissionCheckerFactory;
    +import com.liferay.portal.kernel.security.permission.PermissionThreadLocal;
    +import com.liferay.portal.kernel.service.RoleLocalService;
    +import com.liferay.portal.kernel.service.UserLocalService;
     import com.liferay.portal.kernel.transaction.TransactionCommitCallbackUtil;
     
     import org.osgi.service.component.annotations.Component;
    @@ -35,13 +43,43 @@ public void portalInstanceRegistered(Company company) {
     
     		TransactionCommitCallbackUtil.registerCallback(
     			() -> {
    +				PermissionThreadLocal.setPermissionChecker(
    +					_permissionCheckerFactory.create(
    +						_userLocalService.getUser(
    +							_getAdminUserId(company.getCompanyId()))));
    +
     				_apiApplicationPublisher.publish(company.getCompanyId());
     
     				return null;
     			});
     	}
     
    +	private long _getAdminUserId(long companyId) throws Exception {
    +		Role role = _roleLocalService.getRole(
    +			companyId, RoleConstants.ADMINISTRATOR);
    +
    +		long[] userIds = _userLocalService.getRoleUserIds(role.getRoleId());
    +
    +		if (userIds.length == 0) {
    +			throw new NoSuchUserException(
    +				StringBundler.concat(
    +					"No user exists in company ", companyId, " with role ",
    +					role.getName()));
    +		}
    +
    +		return userIds[0];
    +	}
    +
     	@Reference
     	private APIApplicationPublisher _apiApplicationPublisher;
     
    +	@Reference
    +	private PermissionCheckerFactory _permissionCheckerFactory;
    +
    +	@Reference
    +	private RoleLocalService _roleLocalService;
    +
    +	@Reference
    +	private UserLocalService _userLocalService;
    +
     }
    \ No newline at end of file
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.