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.
| Package | Affected versions | Patched versions |
|---|---|---|
com.liferay:com.liferay.headless.builder.implMaven | < 1.0.32 | 1.0.32 |
Affected products
2- Liferay/DXPv5Range: 7.4.13
Patches
1ccbae813d4a9LPD-30579 Using the right permission checker
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- github.com/advisories/GHSA-fvp7-jj9m-3qpfghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2025-43784ghsaADVISORY
- github.com/liferay/liferay-portal/commit/ccbae813d4a9ec66597191f58d1cb4137f264c99ghsaWEB
- liferay.atlassian.net/browse/LPE-18066ghsaWEB
- liferay.dev/portal/security/known-vulnerabilities/-/asset_publisher/jekt/content/CVE-2025-43784ghsaWEB
News mentions
0No linked articles in our index yet.