An attacker can increase liquidity to the position's UniswapNFT to prevent the position from being closed
UniswapV3NPM allows the user to increase liquidity to any NFT.\\n```\\n            function increaseLiquidity(IncreaseLiquidityParams calldata params)\\n                 external payable override checkDeadline(params.deadline)\\n                    returns (\\n                     uint128 liquidity, uint256 amount0, uint256 amount1)\\n            {\\n            Position storage position = _positions[params.tokenId];\\n                PoolAddress.PoolKey memory poolKey = _poolIdToPoolKey[position.poolId];\\n                    IUniswapV3Pool pool;\\n                        (liquidity, amount0, amount1, pool) = addLiquidity(\\n```\\n\\nWhen closing a position, in `_redeemPosition()`, only the initial liquidity of the NFT will be decreased, and then the NFT will be burned.\\n```\\n             function _redeemPosition(\\n                    address _user, uint _posId\\n                     ) internal override returns (address[] memory rewardTokens, uint[] memory rewardAmts) {\\n                        address _positionManager = positionManager;\\n                    uint128 collAmt = IUniswapV3PositionManager(_positionManager).getPositionCollAmt(_user, \\n                    _posId);\\n                    // 1. take lp & extra coll tokens from lending proxy\\n                    _takeAllCollTokens(_positionManager, _user, _posId, address(this));\\n                         UniV3ExtraPosInfo memory extraPosInfo = IUniswapV3PositionManager(_positionManager)\\n                             .getDecodedExtraPosInfo(_user, _posId);\\n                        address _uniswapV3NPM = uniswapV3NPM; // gas saving\\n                    // 2. remove underlying tokens from lp (internal remove in NPM)\\n                    IUniswapV3NPM(_uniswapV3NPM).decreaseLiquidity(\\n                        IUniswapV3NPM.DecreaseLiquidityParams({\\n                            tokenId: extraPosInfo.uniV3PositionId,liquidity: collAmt, amount0Min: 0,\\n                    amount1Min: 0,\\n                         deadline: block.timestamp\\n                    })\\n                    );\\n                    // rest of code\\n                    // 4. burn LP position\\n                          IUniswapV3NPM(_uniswapV3NPM).burn(extraPosInfo.uniV3PositionId);\\n                      }\\n```\\n\\nIf the liquidity of the NFT is not 0, burning will fail.\\n```\\n        function burn(uint256 tokenId) external payable override isAuthorizedForToken(tokenId) {\\n            Position storage position = _positions[tokenId];\\n                require(position.liquidity == 0 && position.tokensOwed0 == 0 && position.tokensOwed1 == 0,'Not cleared');\\n             delete _positions[tokenId];\\n        _burn(tokenId);\\n        }\\n```\\n\\nThis allows an attacker to add 1 wei liquidity to the position's NFT to prevent the position from being closed, and later when the position expires, the attacker can liquidate it.
Consider decreasing the actual liquidity(using uniswapV3NPM.positions to get it) of the NFT in `_redeemPosition()`, instead of the initial liquidity
```\\n            function increaseLiquidity(IncreaseLiquidityParams calldata params)\\n                 external payable override checkDeadline(params.deadline)\\n                    returns (\\n                     uint128 liquidity, uint256 amount0, uint256 amount1)\\n            {\\n            Position storage position = _positions[params.tokenId];\\n                PoolAddress.PoolKey memory poolKey = _poolIdToPoolKey[position.poolId];\\n                    IUniswapV3Pool pool;\\n                        (liquidity, amount0, amount1, pool) = addLiquidity(\\n```\\n